用Celery同时执行两个任务
我在本地环境中测试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
如果你不指定任何队列,它会默认从所有队列中获取任务。