【发布时间】:2011-01-05 03:00:43
【问题描述】:
在此之前,我在 for 循环中运行了两个命令,例如 对于 $set 中的 x: 命令 为了节省时间,我想同时运行这两个命令,就像makefile中的并行方法一样
谢谢 林恩
【问题讨论】:
-
你为什么不用
subprocess.Popen()?
在此之前,我在 for 循环中运行了两个命令,例如 对于 $set 中的 x: 命令 为了节省时间,我想同时运行这两个命令,就像makefile中的并行方法一样
谢谢 林恩
【问题讨论】:
subprocess.Popen()?
由于全局解释器锁,线程模块不会为您提供太多性能方面的信息。
我认为最好的方法是使用subprocess 模块并使用它自己的标准输出打开每个命令。
processes = {}
for cmd in ['cmd1', 'cmd2', 'cmd3']:
p = subprocess.Popen('cmd1', stdout=subprocess.PIPE)
processes[p.stdout] = p
while len(processes):
rfds, _, _ = select.select(processes.keys(), [], [])
for fd in rfds:
process = processses[fd]
print fd.read()
if process.returncode is not None:
print "Process {0} returned with code {1}".format(process.pid, process.returncode)
del processes[fd]
您基本上必须使用 select 来查看哪些文件描述符已准备就绪,并且您必须检查它们的返回码以查看执行“读取”是否导致它们退出。进程基本上进入等待状态,直到它们的标准输出关闭。如果你想在等待的时候做一些事情,你可以在 select.select() 上设置一个超时,这样你就可以在这么久之后停止等待。你可以测试一下 rfds 的长度,如果是 0 就知道超时了。
【讨论】:
twisted 或 select 模块可能是您所追求的。
如果你想做的只是一堆批处理命令,shell脚本,即
#!/bin/sh
for i in "command1 command2 command3"; do
$i &
done
可能会更好。或者,像你说的那样的 Makefile。
【讨论】:
查看threading 模块。
【讨论】: