如何将Celery任务注册到特定工作人员?

时间:2018-04-26 10:19:48

标签: celery django-celery celery-task celerybeat

我正在使用Python / Django开发Web应用程序,我有几个在芹菜中运行的任务。

我必须一次运行一个任务A,所以我使用--concurrency = 1创建了worker,并使用以下命令将任务A路由到该worker。

celery -A proj worker -Q A -c 1 -l INFO

当这个worker处理任务A而其他任务被路由到默认队列时,一切正常。

但是,当我使用inspect命令获取worker的注册任务时,worker返回所有任务。这是绝对正确的,因为当我启动worker时,它会将项目的所有任务显示为已注册的任务,但只处理任务A.

以下是我启动时工人的输出。

$ celery -A proj worker -Q A -c 1 -l INFO

 -------------- celery@pet_sms v4.0.2 (latentcall)
---- **** ----- 
--- * ***  * -- Linux-4.8.10-040810-generic-x86_64-with-Ubuntu-16.04-xenial 2018-04-26 14:11:49
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         proj:0x7f298a10d208
- ** ---------- .> transport:   redis://localhost:6379/0
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> A exchange=A(direct) key=A


[tasks]
  . task_one
  . task_two
  . task_three
  . A
  . task_four
  . task_five

有没有办法在芹菜中向工人注册特定任务?

1 个答案:

答案 0 :(得分:1)

请注意工作日志中的以下两个部分。

[queues]
  .> A exchange=A(direct) key=A

[tasks]
  . task_one
  . task_two
  . task_three
  . A
  . task_four
  . task_five

第一部分[queues]显示您的工人消耗的队列

它显示A, exchange=A(direct), key=A,指示此工作程序仅使用队列A中的任务。正是您想要的。之所以达到这种效果,是因为在通过命令-Q A启动工作程序时指定了$ celery -A proj worker -Q A -c 1 -l INFO

第二部分[tasks]显示此应用的所有已注册任务。

尽管其他任务(例如task_one task_five)都已注册,但由于这些任务不会进入队列A,因此此工作程序不会消耗任务task_one { {1}}。