Python:一个线程中的进程阻止另一个线程中的进程完成
Python: Process in one Thread stopping a Process in another Thread from finishing
非常感谢线程处理方面的帮助,我对线程处理还很陌生。
示例代码并不是我正在做的(“notepad”和“calc”只是示例命令),而是显示我的问题的简化版本。
我想 运行 两个单独的线程,每个线程 运行 多次执行不同的命令。我希望代码能做到这一点:
- 同时启动“notepad”和“calc”的第一个实例
(确实如此)
- 当我关闭“记事本”实例时,打开
“记事本”的下一个实例。
- 当我关闭“calc”的一个实例时,
打开“calc”的下一个实例。
- [编辑] 我希望脚本等到两个线程都完成,因为它需要对这些线程的输出进行一些处理。
但是,当我关闭“记事本”的一个实例时,“记事本”的下一个实例不会启动,直到我关闭了“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
并且几乎同时启动 终止。由于运行 calculator
的 cmd.exe
与运行 Notepad
的 cmd.exe
几乎同时启动,所以两个 communicate()
调用(一个在 A_thread
和 B_thread
中的一个)等到两个进程都终止。因此,for
循环都不会前进,直到两个进程都终止。
在启动两个线程之间添加延迟可以解决问题。
因此,保持原始代码不变并添加
sleep(1)
两者之间 Thread
starts
产生所需的行为。
在我的系统上,添加 0.0001 秒的延迟可靠地解决了问题,而 0.00001 的延迟则没有。
非常感谢线程处理方面的帮助,我对线程处理还很陌生。
示例代码并不是我正在做的(“notepad”和“calc”只是示例命令),而是显示我的问题的简化版本。
我想 运行 两个单独的线程,每个线程 运行 多次执行不同的命令。我希望代码能做到这一点:
- 同时启动“notepad”和“calc”的第一个实例 (确实如此)
- 当我关闭“记事本”实例时,打开 “记事本”的下一个实例。
- 当我关闭“calc”的一个实例时, 打开“calc”的下一个实例。
- [编辑] 我希望脚本等到两个线程都完成,因为它需要对这些线程的输出进行一些处理。
但是,当我关闭“记事本”的一个实例时,“记事本”的下一个实例不会启动,直到我关闭了“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
并且几乎同时启动 终止。由于运行 calculator
的 cmd.exe
与运行 Notepad
的 cmd.exe
几乎同时启动,所以两个 communicate()
调用(一个在 A_thread
和 B_thread
中的一个)等到两个进程都终止。因此,for
循环都不会前进,直到两个进程都终止。
在启动两个线程之间添加延迟可以解决问题。
因此,保持原始代码不变并添加
sleep(1)
两者之间 Thread
starts
产生所需的行为。
在我的系统上,添加 0.0001 秒的延迟可靠地解决了问题,而 0.00001 的延迟则没有。