Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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_Concurrency_Subprocess_Celery - Fatal编程技术网

Python 芹菜任务子进程是否填满并发槽?

Python 芹菜任务子进程是否填满并发槽?,python,django,concurrency,subprocess,celery,Python,Django,Concurrency,Subprocess,Celery,我正在一个队列中运行一系列长时间运行的重载芹菜任务(生成多个子进程),且CELERYD_CONCURRENCY=4。最初,4项任务按其应有的方式启动。但是,随着任务完成,直到更多的任务完成,才会开始新任务,芹菜会很快将活动任务的数量减少到1或2,直到所有任务完成(由芹菜花确认) 当我只运行一些简单的任务,比如默认的芹菜add函数时,一切都按预期工作 芹菜任务(与任务具有相同的进程组ID)启动的子进程是否计数以填充并发槽?有没有办法确保Celery只计算任务本身的数量?Celery使用prefor

我正在一个队列中运行一系列长时间运行的重载芹菜任务(生成多个子进程),且
CELERYD_CONCURRENCY=4
。最初,4项任务按其应有的方式启动。但是,随着任务完成,直到更多的任务完成,才会开始新任务,芹菜会很快将活动任务的数量减少到1或2,直到所有任务完成(由芹菜花确认)

当我只运行一些简单的任务,比如默认的芹菜
add
函数时,一切都按预期工作


芹菜任务(与任务具有相同的进程组ID)启动的子进程是否计数以填充并发槽?有没有办法确保Celery只计算任务本身的数量?

Celery使用prefork作为默认执行池,并且每次生成子进程(另一个fork)时,它都会计算运行的并发进程的数量,即
CELERYD\u CONCURRENCY
中的数量

避免这种情况的方法是使用,这将允许您在每个任务上生成多个异步调用,只要您的任务没有任何阻塞的调用,如
子进程.communicate


为了进一步优化,您可以尝试将使用subprocess.communicate的任务拆分到另一个队列中,该队列中有一个使用prefork的工作进程,以及所有其他在使用eventlet的工作进程中未阻塞的任务。

我遇到过类似的问题,您是否使用eventlet/gevent?你有多少个队列?@RafaelBarros我使用的是单个队列,而不是eventlet/gevent。试着阅读以下内容,看看是否有意义:@RafaelBarros听起来很有趣。但是,“但您需要确保您的任务不执行阻塞调用”这一说法不切实际,因为我的所有子流程都使用
subprocess.communicate()
,并且在我的情况下不可能进行更改。这就是队列所在的位置,如果可以在不使用subprocess.communicate的情况下将任务拆分为使用eventlet运行的队列,则可以在部分任务中发挥一些优势。否则,我看不出如何在不删除阻塞调用的情况下修复此问题。我相信prefork(芹菜的默认值)会考虑每个子流程调用另一个“fork”,因此不允许同时运行多个任务。