【问题标题】:Will these os.popen commands run in parallel?这些 os.popen 命令会并行运行吗?
【发布时间】:2019-10-18 07:41:15
【问题描述】:

如果我在循环中运行一系列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 的旧脚本中的一个错误,并想检查是否并行执行命令可能会发生。

【问题讨论】:

  • @OferSadan 我在没有 read() 调用的情况下再次尝试了带睡眠的循环,但它似乎仍在等待每个循环完成
  • 我想你需要的是os.popen2

标签: python python-2.7 popen


【解决方案1】:

更新

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

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

【讨论】:

  • 对不起,如果我不清楚 - 我实际上并没有运行所述命令,它们只是示例。我很高兴我使用的命令在运行时有效
  • 你为什么使用readline?为什么你认为应该延迟 10 秒?
  • 我不清楚你为什么说sleep 不是一个有效的测试但ping 是有效的?这两个命令都需要几秒钟才能完成,有什么区别?编辑 - 我想我理解混乱,已经编辑了问题
  • @juanpa.arrivillaga 10 秒是一个估计值,因为它会 ping 10 次,无论哪种方式,它都需要一些时间来完成这个过程,所以如果这个过程等待被执行就很清楚了。我还使用了readline(),所以它不会打印太多,尤其是tree 命令。
  • @codebox time.sleep() 将在 python 中运行,因此它将停止并等待循环中的下一个进程。如果我们运行一个有延迟并且需要一些时间返回的 cmd 命令,我们可以识别进程是同时运行还是一个等待另一个完成。
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2015-03-11
相关资源
最近更新 更多