你如何配置`celery`来使用序列化器'pickle'?

how do you configure `celery` to use serializer 'pickle'?

在tasks.py这边我是这样的:

app = Celery(
        main='tasks',
        backend='rpc://',
        broker='pyamqp://USERNAME:PASSWORD@localhost',
        )
app.conf.task_serializer = 'pickle'
app.conf.result_serializer = 'pickle'
app.conf.event_serializer = 'pickle'
app.conf.accept_content = ['pickle']
app.conf.task_accept_content = ['pickle']
app.conf.result_accept_content = ['pickle']
app.conf.event_accept_content = ['pickle']

当我手动启动两个工人时,我通过:

celery --app tasks worker --concurrency=1 -n by_hand_1 &
sleep 5
celery --app tasks worker --concurrency=1 -n by_hand_2

我收到错误:

[ERROR/MainProcess] Refusing to deserialize disabled content of type pickle (application/x-python-serialize

如何配置 celery 以使用序列化程序 'pickle'?

p.s。关于“重复”,celery 框架发生了重大变化,自 4.0 版以来,默认序列化程序已从 pickle 更改为默认 json... 所以这就是我问一个新问题的原因。

使用 MIME 类型配置应用程序似乎可以解决问题:

app.conf.task_serializer = 'pickle'
app.conf.result_serializer = 'pickle'
app.conf.accept_content = ['application/json', 'application/x-python-serialize']

以前我试图用 'pickle' 设置接受连接字段,但没有帮助。

p.s。这里有一些关于你是否需要 pickle 序列化器的更多注意事项:

  • 如果你需要发送 json-non-serializable objects 那么你还需要配置任务序列化器 'pickle'
  • 如果您的结果有 json-non-serializable objects 那么您需要将结果序列化程序配置为 'pickle'
  • accept_content 设置为上面的值意味着您可以发送 jsonpickle 并且 celery 将在消息中看到类型 headers做正确的事