[英]Python multiprocessing: print() inside 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.