我使用的是python 2.7和django 1.27,我使用的任务是芹菜。
我有这个视图
def my_view(request):
do_stuff()
local_1 = 1
local_2 = 4
celery_delayed_task(locals())
return HttpResponse('OK')
这就导致了被排除在外
传递locals()失败:定义slots而不定义getstate的类不能被pickle
所以我想也许我需要创建一个locals()字典的副本,因为当视图不再存在时,会调用该任务。
我试试这个:
def my_view(request):
do_stuff()
local_1 = 1
local_2 = 4
locals_dict = copy.deepcopy(locals())
celery_delayed_task(locals_dict)
return HttpResponse('OK')
现在我得到了这个错误:
对象的深度复制失败:对象new(cStringIO.StringO)不安全,请使用cStringIO.StringO。new[/strong>()
很明显我做错了,有什么想法吗?
必须序列化任务参数。
Celery默认使用Python pickle协议,但也支持json、yaml、msgpack或自定义序列化程序。
您尝试发送的对象无法进行腌制。你有可能让他们变得可挑剔,但最终——把当地人当作任务论据并不是一个好做法。
请参阅:http://docs.python.org/library/pickle.html