gpt4 book ai didi

Python多处理: print() inside apply_async()

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:29 33 4
gpt4 key购买 nike

传递给多处理的 apply_async() 的函数内的 print() 不会打印任何内容。

我想最终使用 apply_async 来处理大块的文本文件。因此,我希望脚本在屏幕上打印出已经处理了多少行。但是,我根本没有看到任何打印输出。

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

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 可能是 block 缓冲的,这意味着少量的 print 可以在不填充缓冲区的情况下进行缓冲(因此缓冲区永远不会刷新到屏幕/文件)。通常,Python 在退出时刷新缓冲区,因此这不是问题。

问题是,为了避免双重清理带来的一系列棘手问题,当使用多处理时,工作人员会退出 using os._exit ,它绕过所有清理过程(包括刷新 stdio 缓冲区)。如果您想确保发出输出,请告诉 print 通过更改立即刷新输出:

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

至:

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

关于Python多处理: print() inside apply_async(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56366857/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com