2012-09-06 70 views
0

我使用python 2.7和django 1.27,我使用芹菜任务。django通过当地人()芹菜任务

我有这种说法

def my_view(request): 
    do_stuff() 
    local_1 = 1 
    local_2 = 4 
    celery_delayed_task(locals()) 
    return HttpResponse('OK') 

这导致了这个错误时抛出

Passing locals() fails: a class that defines slots without defining getstate cannot be pickled

所以我想也许我需要创建当地人的副本()字典,因为任务将被调用时,该视图不再存在。

我试试这个:

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') 

,现在我得到这个错误:

Deepcopy of object fails: object.new(cStringIO.StringO) is not safe, use cStringIO.StringO.new()

显然我这样做不对,有什么想法?

回答

1

任务参数必须被序列化。

Celery默认使用Python pickle协议,但也支持json,yaml,msgpack或自定义序列化器。

您尝试发送的对象不能被腌渍。你有可能让它们变成可以腌制的,但是在最后传递的当地人中,作为任务参数不是一个好习惯。

参见:http://docs.python.org/library/pickle.html