使用Celery同时执行两个任务

时间:2014-08-29 14:57:19

标签: python django 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 个答案:

答案 0 :(得分:12)

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

<强> 1。单一工作人员 - 单个队列。

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

这将启动一个同时执行2个任务的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')

答案 1 :(得分:1)

使用 --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