0

我正在使用 python 2.7 和 django 1.27,我正在使用 celery 执行任务。

我有这个观点

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

这导致了这个异常

传递locals()失败:不能pickle定义slot而不定义getstate的类

所以我想也许我需要创建 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。()

显然我做错了,有什么想法吗?

4

1 回答 1

1

任务参数必须是序列化的。

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

您尝试发送的对象不能被腌制。您有可能让它们变得可腌制,但最后——将本地人作为任务参数传递并不是一个好习惯。

请参阅:http ://docs.python.org/library/pickle.html

于 2012-09-10T15:16:50.333 回答