Python 同时运行多个命令

0 投票
3 回答
2115 浏览
提问于 2025-04-16 09:25

在这之前,我在一个循环里运行了两个命令,像这样:

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,那就说明超时了。

撰写回答