📜  多处理打印不起作用 - Python (1)

📅  最后修改于: 2023-12-03 15:37:51.641000             🧑  作者: Mango

多处理打印不起作用 - Python

最近,你可能遇到了一个问题,就是当在Python中使用多处理时,打印语句不会按照预期输出。这个问题可能很困扰,但是其实有一些简单的解决办法。

问题描述

通过以下示例代码进行说明:

import multiprocessing

def print_numbers(n):
    print(n)

if __name__ == "__main__":
    for i in range(5):
        p = multiprocessing.Process(target=print_numbers, args=(i,))
        p.start()

运行上述代码可以发现,它并不能按照预期输出数字1到5。而是会出现类似以下的输出:

1

2
4
0
3
原因

多处理时,每个进程都有自己的标准输出(stdout)和标准错误输出(stderr)。这些输出通常由操作系统来缓存,然后再输出到终端或文件中。由于缓存的存在,我们无法预知何时输出会实际出现在终端或文件中。

解决方案
方案一:使用sys.stdout.flush()手动刷新输出缓存

通过在打印语句后使用sys.stdout.flush(),可以手动刷新输出缓存。示例代码如下:

import sys
import multiprocessing

def print_numbers(n):
    print(n)
    sys.stdout.flush()  # 手动刷新输出缓存

if __name__ == "__main__":
    for i in range(5):
        p = multiprocessing.Process(target=print_numbers, args=(i,))
        p.start()
方案二:使用multiprocessing.set_start_method('spawn')修改进程启动方式

可以通过将进程启动方式改为spawn,使每个进程都在启动时获取一个新的Python解释器进程,避免了不同进程共享同一个输出缓存的问题。示例代码如下:

import multiprocessing

def print_numbers(n):
    print(n)

if __name__ == "__main__":
    multiprocessing.set_start_method('spawn')  # 修改进程启动方式
    for i in range(5):
        p = multiprocessing.Process(target=print_numbers, args=(i,))
        p.start()
结论

在多处理时,由于每个进程都有自己的输出缓存,可能出现打印语句不按预期输出的问题。可以通过手动刷新输出缓存或修改进程启动方式来解决这个问题。