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

时间:2017-12-25 20:53:22

标签: python python-3.x asynchronous multiprocessing

我对其中包含多个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(),所以寻找一些更复杂的解决方案:)

1 个答案:

答案 0 :(得分:1)

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