簡體   English   中英

Python:不應該多處理運行的代碼部分

[英]Python: Multiprocessing running portion of code that it shouldn't

我有點玩弄多處理和不同的數學庫來計算 pi,並想通過實現time.perf_counter()來了解使用或不使用多處理的速度有多快。 mp.Pool 映射 20 個線程與我的 CPU 線程數相同,在處理 main 時,它也處理了

etime = time.perf_counter()
print(f"Time Used: {etime - stime:0.4f}sec.\n")

它打印了 20 次。

結果排除打印解決:

...
...
...

Time Used: 0.0001sec.

Time Used: 0.0001sec.

Time Used: 0.0000sec.

Time Used: 15.0268sec.
import time
import numpy as np
from mpmath import mp
import multiprocessing as mps

stime = time.perf_counter()
mp.dps = 50
accuracy = 6000000
R = 1


def solve(a):
    n = a
    theta = 360 / n
    rad = mp.radians(theta/2)
    print(n*R*mp.sin(rad))


if __name__ == "__main__":
    pool = mps.Pool(mps.cpu_count())
    pool.map(solve, range(1, accuracy))
    pool.close()
    pool.terminate()
    pool.join()


etime = time.perf_counter()
print(f"Time Used: {etime - stime:0.4f}sec.\n")

TLDR:要解決您的問題,只需縮進最后兩行。

multiprocessing庫實際上在每個線程中運行整個 Python 腳本。 作為一個實驗,在與程序相同的目錄中運行python並嘗試導入它。 您會注意到,即使solve function 沒有運行,底部的兩條語句也會運行

因此,任何不在if __name__ == "__main__":塊中的東西都將由每個線程運行。 if __name__ == "__main__":語句告訴 Python 僅在主線程中運行此代碼。

要解決您的問題,您需要將底部兩行添加到if語句中。

暫無
暫無

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

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