【问题标题】:Printing in parallel processes using Python sub-process module使用 Python 子进程模块在并行进程中打印
【发布时间】:2018-04-17 10:50:06
【问题描述】:

我正在使用 python 子进程,如下所示。

import subprocess


p1 = subprocess.Popen(['python', 'test1.py'])
p2 = subprocess.Popen(['python', 'test2.py'])

p1.wait()
p2.wait()

print('The main and sub-processes are finished')

test1.py 和 test2.py 中都有 print 语句。其期望的行为是连续打印“test1”或“test2”。

我期待一种混合输出,因为它们是并行运行的。但是,我只看到“test1”:

test1
test1
test1
and so on. 

我在这里错过了什么?

所需的输出:两个打印语句都应该在 STDOUT 上。

注意:这是一个非常简单的问题示例。 注意:想象一下 test1 和 test2 看起来像这样。

test1.py:

for i in range(100000):
    print('test1')

test2.py:

for i in range(100000):
    print('test2')

【问题讨论】:

    标签: python-3.x multiprocessing subprocess


    【解决方案1】:

    您的程序运行良好。由于繁忙的循环不会串联运行,因此您只会从其中一个进程中获得大量尾随输出。尝试将您的 test1 和 test2 更改为:

    from time import sleep
    
    for i in range(1000):
        print('test2')
        sleep(0.1)
    

    您将看到预期的输出。

    【讨论】:

    • 成功了。但是,理想情况下,我不想使用睡眠。是否有其他解决方法?
    • 这只是为了演示。它证明了您的输出是并行处理的并且是交错的 - 基于子流程的执行方式。如果您需要同步它们,那么您需要例如锁。在任何平台上都不能保证线程获得完全相同的 CPU/IO 时间。
    • 如果你循环一百万次并打印出一些东西,由于线程执行不均匀,当第一个线程完成时,其中一个线程将有大约 10000 次迭代,使得尾部总是看起来“糟糕”。尝试运行您的脚本并将输出重定向到一个文件并检查该文件。您可以看到大部分文件显示交错的“test1”和“test2”,并且仅在开头(test2 尚未启动)和结尾处有单个输出,如上所述。
    • 当我运行你的代码时,我第一次有很多尾随 test1 消息,但第二次尝试消息是 test2。这意味着我们只是不知道您的哪个线程先完成。
    猜你喜欢
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多