merci à l'avance :)Django et Céleri: incapable de tâche de conserves au vinaigre
J'ai ce async appel tâche Céleri:
update_solr.delay(id, context)
où id est un entier et le contexte est un dict Python.
Ma définition de tâche ressemble à:
@task
def update_solr(id, context):
clip = Clip.objects.get(pk=id)
clip_serializer = SOLRClipSerializer(clip, context=context)
response = requests.post(url, data=clip_serializer.data)
où clip_serializer.data
est un dict et url
est une chaîne représentant une URL.
Quand je tente d'appeler update_solr.delay()
, je reçois cette erreur:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Aucune des args à la tâche sont des méthodes d'instance, donc je suis confus.
Lorsque le code de tâche est exécuté de manière synchrone, aucune erreur.
Mise à jour: Correction de commentaires sur le passage de pk au lieu de l'objet.
Pour éviter les conditions de course et réduire la taille de la charge utile, il est préférable de transmettre le modèle PK plutôt qu'une instance de modèle. – AndrewS
Tout à fait raison, mais cela ne résout pas le problème. – hamsterdam
Quelque chose * dans les objets est * une méthode d'instance (c'est-à-dire que vous mettez Object.foomethod dans un dictionnaire, ou quelque chose de similaire), dans un endroit où pickle ne peut pas le décaper. –