Python多重处理:apply_async()

时间:2019-05-29 18:52:51

标签: python python-3.x multiprocessing python-multiprocessing

传递给多重处理的apply_async()的函数中的

print()不会打印出任何内容。

我想最终使用apply_async分块处理大型文本文件。因此,我希望脚本在屏幕上打印出已处理了多少行。但是,我什么都看不到。

我附上了玩具代码。每个foo()调用都应该告诉我正在使用什么进程。在我的实际代码中,我将在每个块上调用foo(),它会告诉我已经处理了该块中多少行文本。

import os
from multiprocessing import Pool

def foo(x,y):
    print(f'Process: {os.getpid()}')
    return(x*y)

def bar(x):
    p = Pool()
    result_list = []
    for i in range(30):
        p.apply_async(foo, args=(i,i*x), callback=result_list.append)
    p.close()
    p.join()
    return(result_list)

if __name__ == '__main__':
    print(bar(2))

我从乘积x * y结果中得到了打印,但是我没有看到任何打印出来告诉我进程ID。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

您的sys.stdout可能是块缓冲的,这意味着少量print可以在不填充缓冲区的情况下得到缓冲(因此,缓冲区永远不会刷新到屏幕/文件中)。通常,Python会在退出时刷新缓冲区,所以这不是问题。

问题是,为了避免使用双重清除带来许多棘手的问题,使用multiprocessing时,工作程序退出using os._exit,这会绕过所有清除过程(包括刷新stdio缓冲区)。如果您要确保输出已发出,请告诉print通过更改以下内容立即刷新输出:

print(f'Process: {os.getpid()}')

收件人:

print(f'Process: {os.getpid()}', flush=True)