2016-08-10 125 views
2

我从Celery doc了解到,默认情况下,Celery会在执行任务之前确认消息。Celery获取任务消息并执行的策略是什么?

芹菜工作人员是否会检索多个任务消息并将它们组合在一起,或者只是检索一个,确认一个并执行一个,然后检索下一个,确认并执行它?

如果是后者,对于greenlet模式的工作者,当它执行任务并等待网络响应时,它是否会检索另一个任务消息并执行它,或者只是等待第一个任务完成?

回答

0

在这里找到答案:https://github.com/celery/celery/issues/3394

有一个greenlet线程负责接收消息(任务 消费者),并有greenlet工作者线程池。

任务使用者接收到一个任务消息并将其发送到池中,然后 接收另一个任务消息并将其发送到池中,依此类推。

池工作者线程接收任务消息,并承认 它开始通过发送消息到任务 消费者做这个工作,任务然后消费者通过发 basic.ack给代理的任务。

  • [消费者]接收任务消息
  • [消费者]代表任务消息汇集
  • [PoolWorker-1]接收任务消息
  • [PoolWorker-1]发送ACK返回给消费者(I现在正在处理此任务)
  • [消费者]从池工作者处收到确认,并通知经纪人确认消息。

这两个线程并行发生。只有中介 接收任务的连接被允许确认消息,并且 代理连接不能在线程之间共享,因此只有 消费者线程被允许读/写代理套接字。