试图了解芹菜如何使用来自the following link
的rabbitmq代码:
from celery import Celery
app=Celery('tasks',backend='amqp',broker='amqp://')
@app.task(ignore_result=True)
def print_hello():
print 'hello'
for i in xrange(2,222222):
print i
print_hello()
问题:
运行celery worker -A celery_test -n 1.%h &
有什么用?我可以直接运行python脚本。
如果想在被调用的函数中读取结果,如下所示:
from celery import Celery
app=Celery('tasks',backend='amqp',broker='amqp://')
@app.task()
def print_hello(n):
print 'hello'
for i in xrange(2,n):
print i
# continue the code from here after the above processing
答案 0 :(得分:2)
- 运行
醇>celery worker -A celery_test -n 1.%h &
有什么用?我可以直接运行python脚本。
你可以直接运行脚本,但是你必须手动完成。
Celery以这种方式工作:
现在我当然省略了一些细节(Celery提供了许多有趣的功能),我想说的是Celery是关于从应用程序向工作者云发起任务。
因此,手动运行脚本没有任何好处。您应该远程启动任务以使Celery有用。
- 如果想要在被调用的函数中读取结果,如[...]
醇>
您必须删除ignore_result=True
(您已经这样做了)。然后,从启动任务的应用程序中,您可以在任务完成后检索结果。摘录自guide you are following:
要检查任务是否完整,我们可以使用
.ready
方法:[...]
我们可以使用
.get
方法获取值。
请注意,.get
将为您提供任务的返回值,而不是输出。您的print_hello()
正在生成输出,但未返回任何内容:.get
将返回None
。
如果您想从其他地方(而不是从启动任务的应用程序)获取结果,您可以使用the task_id
。
答案 1 :(得分:1)
celery的想法是,任务在不同的进程中异步运行,称为" workers",可能在许多机器上运行。您安排任务的应用程序(您运行的python脚本)不必了解您的设置:工作人员实际运行的位置,其中有多少等等。这就是您必须自己启动工作人员的原因与celery worker
。
在你的脚本中,你同步调用任务,所以它立即执行,而不是在rabbitmq中排队并交给工人。在Web应用程序的上下文中,您需要以不同方式安排任务(请参阅有关calling tasks的Celery文档。)
Celery可以将任务结果存储在result storage中。
答案 2 :(得分:1)
问题2:
from path.to module import print_hello
task_result = print_hello.apply_async((10,), {})
result = task_result.get()