从芹菜任务

时间:2015-10-22 11:56:31

标签: python celery

我有一个芹菜任务调用另一个远程任务(它位于另一个芹菜应用程序,另一个服务器......)。 当我尝试从我的任务中尝试.get()这个远程任务的结果时:

@app.task()
def my_local_task():
  result_from_remote = app.send_task('remote_task', [arg1, arg2])
  return result_from_remote.get()

我收到此错误:

RuntimeWarning: Never call result.get() within a task! See http://docs.celeryq.org/en/latest/userguide/tasks.html#task-synchronous-subtasks

In Celery 3.2 this will result in an exception being
raised instead of just being a warning.

  warnings.warn(RuntimeWarning(E_WOULDBLOCK))

基本上我希望我的任务是"同步" - 我希望它等待远程任务的结果,并且我可以使用它。

我可以告诉芹菜吗? 当然有链接的解决方案,除了链接远程任务是不可能的。调用远程任务的唯一方法是使用app.send_task,它返回一个AsyncResult,并且我不能链接,因为我需要任务函数本身。

4 个答案:

答案 0 :(得分:17)

如果您知道自己在做什么是安全的话,这是一个隐藏警告的片段:

StaleElementReferenceError

source

答案 1 :(得分:2)

如果您希望任务同步,可以使用ready()来保持循环:

import time

while not result_from_remote.ready():
    time.sleep(5)

return result_from_remote.get()

答案 2 :(得分:1)

  

当然有链接解决方案,除了链接远程任务是不可能的。调用远程任务的唯一方法是使用app.send_task,它返回一个AsyncResult,并且我不能链接,因为我需要任务函数本身。

不,可以将远程任务链接起来。我刚刚在我的项目中尝试过它并且可行。我建议你首先尝试一个简单的测试任务,以确保在转向更复杂的事情之前先掌握基础知识。我已经创建了这些任务:

Program Database (/Zi)

这两项任务保存在名为@app.task def foo(arg): return arg + 1 @app.task def bar(arg): return "I barred " + str(arg) 的模块中。 (它是Django项目的一部分。)

然后我写了一个命令:

app.tasks

我上了屏幕:

import celery
print (celery.signature("app.tasks.foo", args=(1, )) |
       celery.signature("app.tasks.bar")).delay().get()

答案 3 :(得分:0)

这适用于芹菜4

@app.task()
def my_local_task():
    result_from_remote = app.send_task('remote_task', [arg1, arg2])

    while not result_from_remote.ready():
        time.sleep(1)

    return result_from_remote.result