Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用芹菜同时执行两项任务_Python_Django_Celery - Fatal编程技术网

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完成后运行。至少这是读取控制台输出的方式 这些任务相互之间没有依赖性,因此我不希望一个任务在进入下一

我在当地环境中测试芹菜。我的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

实现这一点有多种方法

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,不知道。