这就是我向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开发组件。所以,问题来了。
1条答案
按热度按时间0yg35tkg1#
您必须在调用AsyncResult并使用它之前初始化应用程序。Celery有一个
current_app
代理变量,它被解析为当前会话/运行时中的当前应用示例。正如您所猜测的,通过current_app
引用,在AsyncResult
内部存在到app
示例的某种连接。如果你在python REPL会话中运行它,启动一个新的终端并测试。这将抛出
Backend not configured properly
异常。