我有一个Erlang系统。 我希望这个系统能够在另一个基于 Python 的系统上触发 Celery 任务。 它们共享同一个主机,Celery 正在使用 Redis 作为其代理。
是否可以将 Celery的任务直接插入 Redis 中(在我的例子中,来自 Erlang(,而不是使用 Celery API?
是的,您可以将任务直接插入 redis 或您与芹菜一起使用的任何后端。
您必须匹配 celery 序列化格式(默认情况下为 JSON(,并确定它要插入到哪些键。使用的密钥结构没有明确记录,但源代码的这一部分是一个很好的起点。
您还可以使用 redismonitor
命令实时观察芹菜使用哪些键。
根据 Celery 文档中的任务消息定义,消息正文具有以下格式(对于版本 5.2(:
body = (
object[] args,
Mapping kwargs,
Mapping embed {
'callbacks': Signature[] callbacks,
'errbacks': Signature[] errbacks,
'chain': Signature[] chain,
'chord': Signature chord_callback,
}
)
因此,要触发任务,您应该将带有如下正文的消息放入 Celery 后端的队列(表示为 Python 数据结构(:
[
['arg1', 'arg2'], # positional arguments for the task
{'kwarg1': 'val1', 'kwarg2': 'val2'}, # keyword arguments for the task
{'callbacks': None, 'errbacks': None, 'chain': None, 'chord': None}
]