我知道使用subprocess是调用外部命令的首选方式。
但是,如果我想并行运行几个命令,但限制产生的进程数量,该怎么办?
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile)
然后进程将继续,而不等待cmd
完成。因此,我不能将其 Package 在multiprocessing
库的工作进程中。
例如,如果我这样做:
def worker(cmd):
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile);
pool = Pool( processes = 10 );
results =[pool.apply_async(worker, [cmd]) for cmd in cmd_list];
ans = [res.get() for res in results];
那么每个工作线程将在生成一个子进程后完成并返回。
限制子进程数量的正确方法是什么?
3条答案
按热度按时间9gm1akwq1#
不需要多个Python进程甚至线程来限制并行子进程的最大数量:
请参阅Iterate an iterator by chunks (of n) in Python?
如果您希望限制并行子进程的最大和最小数量,可以使用线程池:
只要
limit
子进程中的任何一个结束,就会启动一个新的子进程,以始终保持limit
数量的子进程。或者使用
ThreadPoolExecutor
:下面是一个简单的线程池实现:
若要避免过早退出,请添加异常处理。
如果你想在字符串中捕获subprocess的输出,请参见Python: execute cat subprocess in parallel。
hmtdttj42#
如果要等待命令完成,可以使用
subprocess.call
。有关详细信息,请参阅pydoc subprocess
。您也可以在工作线程中调用
Popen.wait
方法:因为这个答案似乎有些混乱,下面是一个完整的例子:
如果运行上面的代码,您将看到所有
worker
进程 * 并行 * 启动,并且我们能够在它们完成时收集值。e4eetjau3#
我的解决方案是创建一个进程列表并为其设置最大可用长度。
每次在将新进程追加到列表中之前,我都会检查列表。
编码: