我在使用 delay()
函数异步发送任务时注意到了这一点。如果我排队一个任务,例如 task.delay(("tuple",))
,celery 会将参数存储为 ["tuple"]
稍后函数将返回列表而不是元组。猜测这是因为数据存储在 json 中。
这对于元组来说很好,但是我使用的是命名元组,一旦转换为列表,就无法再正确引用。我看到了用字典切换命名元组的明显解决方案。还有其他方法吗?我似乎在芹菜的配置中找不到任何东西。
我正在使用 redis 作为经纪人。
如果您需要保留python本机数据结构,我建议您使用序列化模块之一,例如cPickle,它将保留数据结构,但在Python之外不可读。
Celery 使用 Kombo 进行消息序列化。目前默认的序列化程序是"json",当我们想要反序列化 NamedTuple 时,它没有多大帮助。你可以用你自己的序列化程序覆盖默认的序列化程序,或者只使用'simplejson',默认情况下,它使用选项namedtuple_as_object=True(参见simplejson)。
以下解决方案对我有用:
from kombu import serialization
serialization.register('simplejson',simplejson.dumps, simplejson.loads, 'application/json', 'utf-8')
app = Celery(...) # define your app
app.conf.task_serializer = 'simplejson'
仅此而已。从现在开始,导入应用程序并使用注释的每个任务
@app.task
def task(...)
将使用 SimpleJSON 序列化程序而不是 JSON。