在此之前,我在for循环中运行两个命令,比如 for $ set in $ set: 命令 为了节省时间,我想在同一时间运行这两个命令,如makefile中的并行方法
由于 林恩
答案 0 :(得分:3)
由于Global Interpreter Lock,线程模块不会给你太多性能。
我认为最好的方法是使用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来查看哪些文件描述符已准备就绪,你必须检查它们的返回码,看看是否执行“读取”会导致它们退出。进程基本上进入等待状态,直到stdout关闭。如果您想在等待时做一些事情,可以在select.select()上设置超时,这样您就可以在这么久之后停止等待。您可以测试rfds的长度,如果它是0,那么您就知道发生了超时。
答案 1 :(得分:1)
twisted
或select
模块可能就是您所追求的目标。
如果你想做的只是一堆批处理命令,shell脚本,即
#!/bin/sh
for i in "command1 command2 command3"; do
$i &
done
可能会更好地工作。或者,像你说的Makefile。
答案 2 :(得分:0)
查看threading模块。