cdleary..
44
如果要并行运行多个进程,然后在产生结果时处理它们,可以使用如下所示的轮询:
from subprocess import Popen, PIPE
import time
running_procs = [
Popen(['/usr/bin/my_cmd', '-i %s' % path], stdout=PIPE, stderr=PIPE)
for path in '/tmp/file0 /tmp/file1 /tmp/file2'.split()]
while running_procs:
for proc in running_procs:
retcode = proc.poll()
if retcode is not None: # Process finished.
running_procs.remove(proc)
break
else: # No process is done, wait a bit and check again.
time.sleep(.1)
continue
# Here, `proc` has finished with return code `retcode`
if retcode != 0:
"""Error handling."""
handle_results(proc.stdout)
那里的控制流程有点复杂,因为我试图让它变小 - 你可以根据自己的喜好进行重构.:-)
这具有首先为早期完成请求提供服务的优点.如果您调用communicate第一个正在运行的进程并且结果运行时间过长,那么当您可以处理其结果时,其他正在运行的进程将处于空闲状态.
使用`['/ usr/bin/my_cmd',' - i',path]`而不是`['/ usr/bin/my_cmd',' - i%s'%path] (5认同)
@Tino这取决于你如何定义忙等待.请参阅[忙等待和轮询之间有什么区别?](http://stackoverflow.com/questions/10594426/) (3认同)