Celery AsyncResult 函数如何知道要查询哪个代理或后端?

How Does Celery AsyncResult Function Know Which Broker or Backend to Query?

提问人:Della 提问时间:8/4/2023 最后编辑:Della 更新时间:8/9/2023 访问量:111

问:

这就是我向芹菜工人发送任务并捕获生成的任务 ID 的方式。该变量(即 celery 应用程序)将 redis 代理和后端 url 设置为其属性的一部分。这工作正常。app

from celery import Celery
REDIS_BROKER:str='redis://127.0.0.1:6369'
app: Celery = Celery(backend=REDIS_BROKER, broker=REDIS_BROKER)
task: str = app.send_task(name='add_two_numbers',
                                      args=[28, 93]).id
# task='574b72ad-4512-4e0b-a14b-f56a2f725374' # An example

当我检查任务状态和结果时,这也有效,而我认为它不应该(这就是我问这个问题的原因)。

from celery.result import AsyncResult
status: str = AsyncResult(id='574b72ad-4512-4e0b-a14b-f56a2f725374').state
result: int = AsyncResult(id='574b72ad-4512-4e0b-a14b-f56a2f725374').result

我的问题是为什么这有效?可以在任何 IP 地址上运行任意数量的 redis 代理,这就是我向变量提供代理的套接字地址的原因。不应该要求任务 ID、代理 URL 和后端 URL 为我获取任务状态/结果吗? 或者它是否与脚本中的对象有某种不可见的连接来获取这些代理和后端 URL?appAsyncResultapp

当我抬头时,似乎大多数教程和答案都把 django 和芹菜放在一起来回答问题,但我使用的是没有 django 的芹菜,纯粹是作为没有任何 Web 开发组件的任务处理器。因此,问题来了。

python redis 芹菜 任务 messagebroker

评论


答:

1赞 Lemon Reddy 8/9/2023 #1

在调用 AsyncResult 并使用它之前,必须已初始化应用。Celery 有一个代理变量,该变量被解析为当前会话/运行时中的应用的当前实例。正如您所猜到的,通过引用与内部实例存在一些联系。current_appappAsyncResultcurrent_app

如果您在 python REPL 会话中运行它,请启动一个新终端并进行测试。这将引发 的异常。Backend not configured properly

评论

0赞 Della 8/25/2023
谢谢。在这种情况下,如何在不依赖此隐藏连接的情况下获取状态和结果?我试过了,但它抛出了错误。AynchResult 是否需要整个应用或任务 ID 和后端 URL 就足够了?我可以在这里使用的最小耦合是什么,而不依赖于 ?from celery.result import AsyncResult task='a158ce19-54dc-4d40-b6a4-b7732736537d' status: str = AsyncResult(id=task, backend=REDIS_BROKER).state result: int = AsyncResult(id=task, backend=REDIS_BROKER).result current_app