【发布时间】:2013-08-15 05:01:37
【问题描述】:
提前致谢:)
我有这个异步 Celery 任务调用:
update_solr.delay(id, context)
其中 id 是一个整数,context 是一个 Python 字典。
我的任务定义如下:
@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)
clip_serializer.data 是一个字典,url 是一个代表 url 的字符串。
当我尝试拨打 update_solr.delay() 时,我收到此错误:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
任务的参数都不是实例方法,所以我很困惑。
任务代码同步运行时,没有报错。
更新:每个 cmets 修复了关于传递 pk 而不是对象的问题。
【问题讨论】:
-
为了避免竞争条件并减少有效负载大小,最好传递模型 PK 而不是模型实例。
-
完全正确,但不能解决问题。
-
对象中的某些东西是 实例方法(也就是说,您将 Object.foomethod 放在字典中,或类似的东西中),在一个 pickle 无法腌制它的地方。
-
可能没有定义任务的完整定义为
url?无法腌制异常,因此请尝试在不使用 Celery 的情况下运行该方法。 -
@AndrewS,这不是完整的定义,在代码中已经定义了。
标签: python django celery pickle django-celery