用Celery同时执行两个任务

13 投票
2 回答
15983 浏览
提问于 2025-04-18 20:37

我在本地环境中测试celery。我的Python文件里有以下两行代码:

celery_app.send_task('tasks.test1', args=[self.id], kwargs={})
celery_app.send_task('tasks.test2', args=[self.id], kwargs={})

从控制台输出来看,这两行代码似乎是一个接一个地执行的。不过,test2只有在test1完成后才会运行。至少从控制台输出上看是这样的。

这两个任务之间没有任何依赖关系,所以我不想让一个任务等另一个任务完成后再继续执行下一行。

我该如何让这两个任务同时执行呢?

---- **** -----
--- * ***  * -- Darwin-14.0.0-x86_64-i386-64bit
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         tasks:0x104cd8c10
- ** ---------- .> transport:   sqs://123
- ** ---------- .> results:     disabled
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ----
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery

2 个回答

7

使用--autoscale这个选项来调用工作进程,这样可以根据需要自动增加或减少处理的数量。

--autoscale AUTOSCALE
                       Enable autoscaling by providing max_concurrency,
                       min_concurrency. Example:: --autoscale=10,3 (always
                       keep 3 processes, but grow to 10 if necessary)

举个例子。

celery -A sandbox worker --autoscale=10,0 --loglevel=info 
27

有很多种方法可以实现这个目标。

1. 单个工作者 - 单个队列。

$ celery -A my_app worker -l info  -c 2 -n my_worker

这个方法会启动一个工作者,同时执行两个任务。

2. 多个工作者 - 单个队列。

$ celery -A my_app worker -l info  -c 1 -n my_worker1
$ celery -A my_app worker -l info  -c 1 -n my_worker2

这个方法会启动两个工作者,每次执行一个任务。注意,这两个任务都在同一个队列里。

3. 多个工作者 - 多个队列。

$ celery -A my_app worker -l info  -c 1 -n my_worker1 -Q queue1
$ celery -A my_app worker -l info  -c 1 -n my_worker2 -Q queue2

这个方法会启动两个工作者,每次执行一个任务。不过在这里,你需要根据情况来安排任务。

celery_app.send_task('tasks.test1', args=[self.id], kwargs={}, queue='queue1')
celery_app.send_task('tasks.test2', args=[self.id], kwargs={}, queue='queue2')

4. 单个工作者 - 所有队列

$ celery -A my_app worker -l info -n my_worker1 

如果你不指定任何队列,它会默认从所有队列中获取任务。

撰写回答