为什么这个芹菜“hello world”永远循环?

时间:2017-02-03 00:24:54

标签: python celery

考虑代码:

from celery import Celery, group
from time import time

app = Celery('tasks', broker='redis:///0', backend='redis:///1', task_ignore_result=False)

@app.task
def test_task(i):
    print('hi')
    return i

x = test_task.delay(3)
print(x.get())

我通过调用python script.py来运行它,但我没有得到任何结果。为什么呢?

1 个答案:

答案 0 :(得分:1)

您没有得到任何结果,因为您已经要求您的芹菜应用程序执行任务而不启动工作进程来执行它的工作。您通过get()的调用阻止了您启动的流程。

首先,当使用芹菜时,在导入模块时没有执行任务是至关重要的,所以让我们将任务执行放在main()函数中,并将其放入在名为celery_test.py的文件中。

from celery import Celery, group
from time import time

app = Celery('tasks', broker='redis:///0', backend='redis:///1', task_ignore_result=False)

@app.task
def test_task(i):
    print('hi')
    return i

def main():
    x = test_task.delay(3)
    print(x.get())

if __name__ == '__main__':
    main()

现在让我们开始一个芹菜工作者池来执行这个应用程序的任务。您可以通过打开 new 终端并执行以下命令来完成此操作。

celery worker -A celery_test --loglevel=INFO

-A标志指的是芹菜将找到一个添加工人的应用程序的模块。您应该在终端中看到一些输出,以指示芹菜工作者正在运行并准备好处理任务。

现在,尝试使用python celery_test.py再次执行您的脚本。您应该看到hi显示在worker的日志输出中,但是在调用3的脚本中返回的值get()

请注意,如果您在没有经营工人的情况下一直在玩芹菜,那么您的经纪人可能需要执行大量任务。第一次启动工作池时,您将看到它们全部并行执行,直到代理完成任务。