Python 多处理:print() in apply_async().传递给多处理的 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 的打印输出。

谁能帮我?

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

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

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

自:

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

相关内容

  • 没有找到相关文章

最新更新