簡體   English   中英

python: concurrent.futures.as_completed 僅在所有進程完成后打印結果

[英]python: concurrent.futures.as_completed printing results only after all the processes are completed

1)我正在嘗試使用 concurrentFutures 執行 8 個並行進程。 代碼按預期工作。 但是只有在所有過程完成后才會打印結果。 我希望在結果可用時立即打印結果(而不是在所有過程完成之后)。 我怎樣才能做到這一點?

2) “do_it” function 在 IDLE 環境中不打印任何內容,只有 main() function 中的打印命令在 IDLE window 上打印。但是“do_it”中的打印命令在線打印 python 編譯器 882347039197058 ( 86821) www.programiz.com/python-programming/online-compiler/ )。 為什么?

我在 Windows 操作系統上使用 python3.9.5。

import concurrent.futures
import time

def do_it(x):
    print(f'sleeping for {x}')
    start = time.perf_counter()
    time.sleep(x)
    end = time.perf_counter()
    tTaken = round(end - start, 2)
    return ['done sleeping', tTaken]

def main():
    start = time.perf_counter()

    with concurrent.futures.ProcessPoolExecutor() as executor:
        delays = [1,2,3,4,5,6,7,8]
        results = [executor.submit(do_it, x) for x in delays]

    for f in concurrent.futures.as_completed(results):
        [txt, duration] = f.result()
        print(f'{txt} : time taken {duration}')

    end = time.perf_counter()
    tTaken = round(end - start, 2)
    print(f'total time  taken : {tTaken}')
        
    
if __name__ == '__main__':
    main()

 

您只能在執行程序完成后才開始as_completed

嘗試在執行程序仍然存在時運行:

def main():
    start = time.perf_counter()

    print("Submitting jobs")
    with concurrent.futures.ProcessPoolExecutor() as executor:
        delays = [1, 2, 3, 4, 5, 6, 7, 8]
        results = [executor.submit(do_it, x) for x in delays]

        print("Running as_completed", flush=True)
        for f in concurrent.futures.as_completed(results):
            [txt, duration] = f.result()
            print(f"{txt} : time taken {duration}", flush=True)

    end = time.perf_counter()
    tTaken = round(end - start, 2)
    print(f"total time  taken : {tTaken}")

這應該導致類似的結果:

Submitting jobs
sleeping for 1
sleeping for 2
sleeping for 3
Running as_completed
sleeping for 4
sleeping for 5
done sleeping : time taken 1.04
sleeping for 6
done sleeping : time taken 2.03
sleeping for 7
done sleeping : time taken 3.0
sleeping for 8
done sleeping : time taken 4.01
done sleeping : time taken 5.05
done sleeping : time taken 6.07
done sleeping : time taken 7.01
done sleeping : time taken 8.03
total time  taken : 12.08

編輯

關於output子進程的缺失,這與Python如何在ms-windows上啟動新進程有關。 與 UNIX/POSIX 系統相反,文件句柄不會被子進程繼承。 因此,您不會在 ms-windows 上看到來自子進程的print output。 猜測網上的python運行在UNIX/POSIX系統上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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