【问题标题】:Force Popen processes to execute in certain order in python强制 Popen 进程在 python 中以特定顺序执行
【发布时间】:2013-11-13 15:25:19
【问题描述】:

subprocess.Popen(someexternalCommand) 创建并运行了 5 个进程。顺序启动命令很重要,例如在第一个进程启动并运行之前,第二个进程不得启动。 使用了以下代码:

proc1 = TrafficGenUtils.Popen(someexternalCommand)
time.sleep(10)
proc2 = TrafficGenUtils.Popen(someexternalCommand)
time.sleep(10)
...

当进程数为 3 时,执行顺序得以维持,但在进程数为 5 时,它几乎从未被维护,并且将睡眠时间增加到甚至 60 秒也无济于事。 如何强制 Popen 进程的执行是顺序的。 我的代码不起作用的原因是否与 Popen 依赖操作系统来创建进程但操作系统随时启动它们的事实有关?我正在使用 Windows 8 和 python 2.7

【问题讨论】:

  • 如何知道一个进程何时“已启动并运行”?然后你需要编写代码来教你的程序寻找相同的东西。如果您控制正在启动的进程的代码,这会容易得多(例如,一个进程可以在准备好时创建一个新文件,而您的主程序可以等待该新文件出现)。顺便说一句,sleep() 几乎从来都不是解决进程间(甚至线程间)通信问题的合适方法。
  • 谢谢。但我无法控制主程序正在启动的进程。进程是 exe 文件。
  • 所以我再次问:如何知道进程何时“已启动并正在运行?”。这里没有魔法。你知道或者你不知道。如果你不知道,问题是无法解决的。如果你知道,那么你也必须教你的程序如何知道。
  • 感谢您的指导。我想我会检查子进程是否在正在运行的进程列表中。
  • 我希望这已经足够好了!猜不透。操作系统可能会启动一个进程(此时它将出现在正在运行的进程列表中),但是在操作系统将 CPU 提供给其他进程之前没有给它足够的时间(例如)完成初始化.这就是为什么如果您控制进程的代码,这会变得非常容易。您甚至可能需要等待子进程积累“足够”的 CPU 时间来猜测它可能已经准备好做一些有用的事情了。这里没有魔法:-(

标签: python python-2.7 multiprocessing popen


【解决方案1】:

Popen 启动一个新进程,因此从那一刻起就由操作系统来安排其运行时间。您不仅不能假设一个进程会在另一个进程之前运行,而且您甚至不能假设您的父进程会将执行权交给子进程,实际上可能不会。

为了创建顺序执行,您可以使用proc1.wait() 停止父进程,直到子进程完成其执行。这样可以保证进程按顺序运行,因为父进程在子进程结束之前不会继续运行,因此不会产生其他子进程。

Python Documentation 中了解更多信息。

【讨论】:

  • 谢谢。但是,我的问题是我不希望第一个子进程结束然后第二个开始,而是第一个开始,第二个开始等等。子进程将在后台运行,直到我对它们调用 proc.terminate。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2011-10-01
相关资源
最近更新 更多