我有一个芹菜任务调用另一个远程任务(它位于另一个芹菜应用程序,另一个服务器......)。 当我尝试从我的任务中尝试.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,并且我不能链接,因为我需要任务函数本身。
答案 0 :(得分:17)
答案 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