如何缓冲multiprocessing.Process内部和外部函数的所有print()?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何缓冲multiprocessing.Process内部和外部函数的所有print()?相关的知识,希望对你有一定的参考价值。

我对其中包含多个print()指标的某些任务使用多处理,因此我可以看到该进程如何在cmd中开始/工作/结束。但是,有些任务更快/更慢,所以print()命令是混乱的。我需要找到一种方法,如何在过程结束时立即显示所有print()

简化示例:

from multiprocessing import Process
from time import sleep


def runner(px_id):
    print('Start'+str(px_id))

    if px_id > 1:
        sleep(2)
    elif px_id == 1:
        sleep(5)

    print('Middle'+str(px_id))

    if px_id > 1:
        sleep(2)
    elif px_id == 1:
        sleep(5)

    print('End'+str(px_id))


if __name__ == '__main__':
    px_list = [1, 2, 3]

    for px in px_list:
        p = Process(target=runner, args=(px,))
        p.start()

如果我现在运行此代码,我会收到:

Start1
Start2
Start3
Middle2
Middle3
End2
End3
Middle1
End1

虽然我需要这样的东西:

Start2
Middle2
End2
Start3
Middle3
End3
Start1
Middle1
End1

我仍然需要进程异步(所以不能使用join()),但要在进程结束时打印所有print()。感谢任何建议:)

UPD:使用数组缓冲功能消息是一个很好的解决方案,仍需要一些缓冲外部函数解决方案的帮助。我的意思是,如果我在其他函数中使用某些函数我不能手动缓冲所有print(),所以寻找一些更复杂的解决方案:)

答案

一种选择是让每个实例在内部缓冲区中缓冲输出。然后在最后输出它。您可以让主线程继续并将每个已启动的进程保存在数组中。然后等待所有三个完成,最后从阵列中的每个进程中获取内部缓冲区并连续打印它们。

以上是关于如何缓冲multiprocessing.Process内部和外部函数的所有print()?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 BGRA 缓冲区转换为 RGBA 缓冲区格式?

我们如何强制 html 播放 100% 缓冲音频或视频?

webGL - 如何在帧缓冲区旁边设置模板缓冲区并使用它?

没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小

java 如何清空io缓冲区

如何编辑音频缓冲区