簡體   English   中英

Python多處理:apply_async()中的print()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM