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

时间:2016-08-22 14:11:57

标签: python multithreading subprocess popen terminate

我非常感谢线程的一些帮助,我很陌生。

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

我想运行两个单独的线程,每个线程多次运行不同的命令。我想代码执行此操作:

  1. 同时启动'notepad'和'calc'的第一个实例 (它确实如此)
  2. 当我关闭'记事本'的实例时,打开 下一个'记事本'的例子。
  3. 当我关闭'calc'的实例时,到 打开'calc'的下一个实例。
  4. [edit]我希望脚本等到两个线程都完成,因为它需要对这些线程的输出进行一些处理。
  5. 然而,当我关闭'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()
    

    提前致谢: - )

    尼克

1 个答案:

答案 0 :(得分:1)

因此,- nightly 1.11.0方法显然正在等待communicate()创建的所有进程并执行Popen 并几乎同时启动以终止。由于运行cmd.exe的{​​{1}}几乎与运行cmd.exe的{​​{1}}同时启动,因此calculator次调用cmd.exeNotepad中的一个等待,直到两个进程都有效。因此,communicate()循环都不会进展,直到两个进程都成为术语。

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

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

A_thread
两个B_thread for之间的

会产生所需的行为。

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