2016-08-10 79 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現在正在處理此任務)
  • [消費者]從池工作者處收到確認,並通知經紀人確認消息。

這兩個線程並行發生。只有中介 接收任務的連接被允許確認消息,並且 代理連接不能在線程之間共享,因此只有 消費者線程被允許讀/寫代理套接字。