【发布时间】:2023-02-09 08:42:25
【问题描述】:
我使用 RabbitMQ 作为消息代理,使用 Celery 作为任务队列来处理我的队列内容。让我们举一个基本的例子,我们想要添加两个数字 x 和 y。
我将共享任务创建为:
任务.py
from celery import shared_task
@shared_task
def add(x, y):
return x + y
我看到当我将内容推送到队列时,数据存储为
(myprojectenv) root@ubuntu-s-1vcpu-1gb-blr1-02:/etc/myproject# python manage.py shell
Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from myproject.tasks import add
>>> add.delay(5, 5)
<AsyncResult: 88f4d5c2-f68a-42c1-acda-d64593df1899>
但是我希望我的数据以不同的格式存储,比如
{operation : 'add', listOfNumbers : [5, 5]}
如何更改将数据实际推入队列的方式?在获取相同内容的同时,我可以获得字典并解压缩值并进行处理
【问题讨论】:
-
你试图做的事情毫无意义。该格式是内部的,特定于 Celery。任何更改都将导致 Celery worker 无法执行任务。如果你想编写一些工具来处理 RabbitMQ 中的内容,你需要了解 Celery/Kombu 如何使用 JSON 格式序列化任务(其他格式也是可能的,例如我最喜欢的 MsgPack)。
-
那么它以什么格式存储数据呢?总是列表格式?共享任务的函数定义类型将指定接收什么?是吗?
-
您需要深入研究 Celery/Kombu 源代码以了解它们如何对任务进行 JSON 序列化……人们实际上不需要知道这一点,这就是为什么 Celery 人员没有在 Celery 文档中添加任何内容。
标签: python rabbitmq celery message-queue system-design