芹菜与rabbitmq为什么要开始芹菜加工

时间:2016-02-03 10:22:56

标签: python rabbitmq celery

试图了解芹菜如何使用来自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()

问题:

  1. 运行celery worker -A celery_test -n 1.%h &有什么用?我可以直接运行python脚本。

  2. 如果想在被调用的函数中读取结果,如下所示:

    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
    

3 个答案:

答案 0 :(得分:2)

  
      
  1. 运行celery worker -A celery_test -n 1.%h &有什么用?我可以直接运行python脚本。
  2.   

你可以直接运行脚本,但是你必须手动完成。

Celery以这种方式工作:

  • 你有一个或多个工人在某个地方跑;
  • 应用程序需要让工作人员完成某项任务。它将消息放入队列(在本例中为RabbitMQ)。
  • Celery获取消息并要求其中一名工作人员执行任务。

现在我当然省略了一些细节(Celery提供了许多有趣的功能),我想说的是Celery是关于从应用程序向工作者云发起任务。

因此,手动运行脚本没有任何好处。您应该远程启动任务以使Celery有用。

  
      
  1. 如果想要在被调用的函数中读取结果,如[...]
  2.   

您必须删除ignore_result=True(您已经这样做了)。然后,从启动任务的应用程序中,您可以在任务完成后检索结果。摘录自guide you are following

  

要检查任务是否完整,我们可以使用.ready方法:

     

[...]

     

我们可以使用.get方法获取值。

请注意,.get将为您提供任务的返回值,而不是输出。您的print_hello()正在生成输出,但未返回任何内容:.get将返回None

如果您想从其他地方(而不是从启动任务的应用程序)获取结果,您可以使用the task_id

答案 1 :(得分:1)

  1. celery的想法是,任务在不同的进程中异步运行,称为" workers",可能在许多机器上运行。您安排任务的应用程序(您运行的python脚本)不必了解您的设置:工作人员实际运行的位置,其中有多少等等。这就是您必须自己启动工作人员的原因与celery worker

    在你的脚本中,你同步调用任务,所以它立即执行,而不是在rabbitmq中排队并交给工人。在Web应用程序的上下文中,您需要以不同方式安排任务(请参阅有关calling tasks的Celery文档。)

  2. Celery可以将任务结果存储在result storage中。

答案 2 :(得分:1)

问题2:

from path.to module import print_hello

task_result = print_hello.apply_async((10,), {})
result = task_result.get()