Python:一个线程中的进程阻止另一个线程中的进程完成

Python: Process in one Thread stopping a Process in another Thread from finishing

非常感谢线程处理方面的帮助,我对线程处理还很陌生。

示例代码并不是我正在做的(“notepad”和“calc”只是示例命令),而是显示我的问题的简化版本。

我想 运行 两个单独的线程,每个线程 运行 多次执行不同的命令。我希望代码能做到这一点:

  1. 同时启动“notepad”和“calc”的第一个实例 (确实如此)
  2. 当我关闭“记事本”实例时,打开 “记事本”的下一个实例。
  3. 当我关闭“calc”的一个实例时, 打开“calc”的下一个实例。
  4. [编辑] 我希望脚本等到两个线程都完成,因为它需要对这些线程的输出进行一些处理。

但是,当我关闭“记事本”的一个实例时,“记事本”的下一个实例不会启动,直到我关闭了“calc”的当前实例,反之亦然。 通过一些调试,看起来 'notepad' 的已关闭实例的进程(来自 Popen)在当前 'calc' 关闭之前不会完成。

运行 Python 2.7 Windows 7

示例代码:

from subprocess import Popen, PIPE, STDOUT
from threading import Thread

def do_commands(command_list):

    for command in command_list:
        proc = Popen("cmd.exe", stdin=PIPE, stdout=PIPE, stderr=STDOUT)
        stdout_value, stderr_value = proc.communicate(input=command)

# MAIN CODE
A_command_list = ["notepad\n", "notepad\n", "notepad\n" ]
B_command_list = ["calc\n", "calc\n", "calc\n" ]

A_args = [A_command_list]
B_args = [B_command_list]

A_thread = Thread(target=do_commands, args=(A_args))
B_thread = Thread(target=do_commands, args=(B_args))

A_thread.start()
B_thread.start()

A_thread.join()
B_thread.join()

提前致谢:-)

尼克

所以 communicate() 方法显然正在等待 Popen 创建的所有进程并执行 cmd.exe 并且几乎同时启动 终止。由于运行 calculatorcmd.exe 与运行 Notepadcmd.exe 几乎同时启动,所以两个 communicate() 调用(一个在 A_threadB_thread 中的一个)等到两个进程都终止。因此,for 循环都不会前进,直到两个进程都终止。

在启动两个线程之间添加延迟可以解决问题。

因此,保持原始代码不变并添加

sleep(1)

两者之间 Thread starts 产生所需的行为。

在我的系统上,添加 0.0001 秒的延迟可靠地解决了问题,而 0.00001 的延迟则没有。