Python 同时运行多个命令
在这之前,我在一个循环里运行了两个命令,像这样:
for x in $set:
命令
为了节省时间,我想同时运行这两个命令,就像在makefile中使用并行的方法一样。
谢谢
Lyn
3 个回答
0
看看这个threading模块。
1
你可能需要用到 twisted
或者 select
这个模块。
如果你只是想执行一堆批处理命令,像是一些 shell 脚本,比如:
#!/bin/sh
for i in "command1 command2 command3"; do
$i &
done
这样可能会更好用。或者,你也可以用你提到的 Makefile。
3
线程模块在性能上不会给你太多帮助,因为有个叫全局解释器锁的东西。
我觉得最好的办法是使用 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,那就说明超时了。