![](/img/trans.png)
[英]Shouldn't the Python client for BigQuery work with multiprocessing?
[英]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.