redis Celery AsyncResult函数如何知道查询哪个Broker或后端?

2nbm6dog  于 2023-10-15  发布在  Redis
关注(0)|答案(1)|浏览(149)

这就是我向celery工人发送任务并捕获结果任务id的方式。app变量,即celery应用程序将redis broker和后端URL设置为其属性的一部分。这是工作正常。

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代理,这就是为什么我将代理的套接字地址提供给app变量。AsyncResult不应该要求任务ID,代理URL和后端URL来为我获取任务状态/结果吗?或者它是否与脚本中的app对象有某种不可见的连接,以获取那些代理和后端URL?
当我抬头看时,似乎大多数教程和答案都是将django和celery结合在一起来回答问题,但我使用的是celery而不是django,纯粹作为一个任务处理器,没有任何Web开发组件。所以,问题来了。

0yg35tkg

0yg35tkg1#

您必须在调用AsyncResult并使用它之前初始化应用程序。Celery有一个current_app代理变量,它被解析为当前会话/运行时中的当前应用示例。正如您所猜测的,通过current_app引用,在AsyncResult内部存在到app示例的某种连接。
如果你在python REPL会话中运行它,启动一个新的终端并测试。这将抛出Backend not configured properly异常。

相关问题