我非常感谢线程的一些帮助,我很陌生。
示例代码并不是我正在做的('notepad'和'calc'只是示例命令),而是一个显示我问题的简化版本。
我想运行两个单独的线程,每个线程多次运行不同的命令。我想代码执行此操作:
然而,当我关闭'notepad'的实例时,'notepad'的下一个实例才会启动,直到我关闭当前的'calc'实例,反之亦然。对于“notepad”的封闭实例的过程(来自Popen)看起来似乎没有完成,直到当前的'calc'关闭。
在Windows 7上运行Python 2.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()
提前致谢: - )
尼克
答案 0 :(得分:1)
因此,- nightly 1.11.0
方法显然正在等待communicate()
创建的所有进程并执行Popen
并几乎同时启动以终止。由于运行cmd.exe
的{{1}}几乎与运行cmd.exe
的{{1}}同时启动,因此calculator
次调用cmd.exe
和Notepad
中的一个等待,直到两个进程都有效。因此,communicate()
循环都不会进展,直到两个进程都成为术语。
在启动两个线程之间添加延迟可以解决问题。
因此,保持原始代码不变并添加
A_thread
两个B_thread
for
之间的会产生所需的行为。
在我的系统上,添加0.0001秒的延迟可靠地解决问题,而延迟0.00001则没有。