【问题标题】:Asynchonous subtasks in Celery PythonCelery Python 中的异步子任务
【发布时间】:2016-03-04 07:44:28
【问题描述】:

我需要 celery 中的异步调用子任务到另一个工作人员(在另一台机器上),如下所示:

#db.py
@task()
def query(x,y):
   ...something
   return z

#worker2.py
@task()
def main(x,y):
   result=db.query.async((x,y), queue='db')
   try:
       a=result.get(timeout=5)
   except celery.exceptions.TimeoutError:
       ....

但我在启动工人时收到警告: RuntimeWarning:切勿在任务中调用 result.get()!

如何从另一个任务调用异步任务?我不会使用链,和弦等。

【问题讨论】:

  • 正确的做法是使用链式。为什么不能用?
  • 我现在尝试了链: res = chain(db.query.s(x, y))() print(res.get()) 并且我得到 ** Never call result.get()在任务中!** 再次:(
  • 这里有同样的问题。 Celery 在固定场景中表现不错,您从一开始就知道将要执行什么,但是当场景是动态的时,我遇到了这个问题并且它会阻止工作人员

标签: python celery


【解决方案1】:

你永远不想阻止一个任务等待另一个任务,所以正确的方法是使用chain

db.py
@task()
def query(x, y):
   ...something
   return z

#worker2.py
@task()
def main(resultFromQuery, x, y):
   a = resultFromQuery.get(timeout=5)
   ...

res = chain(query.s(x,y), main.s(x,y));
res.get()

【讨论】:

  • 但我需要从另一个任务调用子任务。不是来自主程序。这是我一开始不知道确切工作流程的系统:(
  • 那么不要打电话给result.get()——你需要第二个任务的结果吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-22
  • 2016-12-13
  • 1970-01-01
  • 2011-11-22
  • 2020-05-08
  • 2019-08-23
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多