这些 os.popen 命令会并行运行吗?



如果我在循环中运行一系列os.popen(...)语句,每个语句都附加一个read(),命令是并行运行,还是read()调用会导致代码等到每个进程终止后再继续?

for cmd in ['cmd1', 'cmd2', 'cmd3']:
os.popen(cmd).read()

通过阅读文档,我认为命令将并发运行,但是我尝试了一个实验,在循环中启动了一系列sleep 1命令,如下所示:

for cmd in ['sleep 1', 'sleep 1', 'sleep 1']:
os.popen(cmd).read()

并且期望它们同时运行,但相反popen似乎等到每个睡眠命令完成后再继续下一个命令,所以现在我不确定。

我知道os.popen已被弃用,应该改用subprocess模块,但是我正在调查使用os.popen的旧脚本中的一个错误,并想检查是否可以并行执行命令。

更新

在您的情况下,read()失败['cm1', 'cmd2', 'cmd3']因为这些命令不是有效的命令。即使在调试器上,如果您暂停并尝试执行os.popen(cmd).read()它也会永远进行评估。运行time.sleep()但不是在 for 循环中是一个很好的想法,因为这样你就不会得到所需的结果。一个有效的测试是在控制台中运行'sleep',由于TIMEOUTfrompopen()重定向输入并失败,我们可以使用上述示例:

import os
import time
for cmd in ['ping -n 3 127.0.0.1', 'ping -n 5 127.0.0.1', 'tree']:
print(time.time())
print(os.popen(cmd).readline())

在这种情况下,第一个命令将有 10 秒的延迟,我们可以看到进程不会同时运行,而一个进程等待另一个命令完成。 以下是每个进程的结果和运行时间:

1571386961.499955

Pinging 127.0.0.1 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 127.0.0.1:
Packets: Sent = 3, Received = 0, Lost = 3 (100% loss),

1571386975.433736

Pinging 127.0.0.1 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 127.0.0.1:
Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),

1571386999.4259672

Folder PATH listing
Volume serial number is EAE9-D593
C:.
ΓΔΔΔ.idea
³   ΓΔΔΔdictionaries
³   ΐΔΔΔinspectionProfiles
ΓΔΔΔarch_import_ops

最新更新