Python 用芹菜同时执行两项任务
我在当地环境中测试芹菜。我的Python文件包含以下两行代码:Python 用芹菜同时执行两项任务,python,django,celery,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完成后运行。至少这是读取控制台输出的方式 这些任务相互之间没有依赖性,因此我不希望一个任务在进入下一
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
实现这一点有多种方法 1。单个工人-单个队列。
$ celery -A my_app worker -l info -c 2 -n my_worker
$ celery -A my_app worker -l info -c 1 -n my_worker1
$ celery -A my_app worker -l info -c 1 -n my_worker2
$ 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
这将启动一个同时执行两个任务的工作进程
2。多个工作人员-单个队列。
$ celery -A my_app worker -l info -c 2 -n my_worker
$ celery -A my_app worker -l info -c 1 -n my_worker1
$ celery -A my_app worker -l info -c 1 -n my_worker2
$ 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
这将启动两个工人,一次执行一个任务。注意:两个任务都在同一队列中
3。多个工作人员-多个队列。
$ celery -A my_app worker -l info -c 2 -n my_worker
$ celery -A my_app worker -l info -c 1 -n my_worker1
$ celery -A my_app worker -l info -c 1 -n my_worker2
$ 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
如果您没有提到任何队列,默认情况下它将从所有队列中使用 使用
--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
@那么这是一个并发问题?我不必在这里使用并行任务?它在启动时声明我有“并发:4(预工作)”@user1012513您可以运行
芹菜-A my_应用程序worker-l info-c1-n my_worker1-Q queue1,queue2,queueue3
如果您没有提到have-Q标志,默认情况下,这些worker会从所有队列中读取。@aditymanagesh是的,您是对的。更新的答案。@chillarand,在我的例子中,即使我在芹菜工人命令中使用-c2,一个任务正在阻止另一个任务。我使用的命令是芹菜工人-A芹菜\u app-P gevent-l info-c2
。你能告诉我我还应该改变什么,以便两个任务可以并行运行吗?@sattva_venu你找到解决方案了吗?我也有同样的问题在windows上工作?我尝试了一下,但仍然有一个芹菜任务阻止了另一个芹菜任务。@sattva_venu抱歉,我不使用Windows,不知道。