有什麼區別ThreadPool
和Pool
模塊之間的區別是什麼。當我嘗試我的代碼了,這是我看到的主要區別:ThreadPool與Python之間的Python多處理模塊
from multiprocessing import Pool
import os, time
print("hi outside of main()")
def hello(x):
print("inside hello()")
print("Proccess id: ", os.getpid())
time.sleep(3)
return x*x
if __name__ == "__main__":
p = Pool(5)
pool_output = p.map(hello, range(3))
print(pool_output)
我看到下面的輸出:
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
inside hello()
Proccess id: 13268
inside hello()
Proccess id: 11104
inside hello()
Proccess id: 13064
[0, 1, 4]
隨着 「線程池」:
from multiprocessing.pool import ThreadPool
import os, time
print("hi outside of main()")
def hello(x):
print("inside hello()")
print("Proccess id: ", os.getpid())
time.sleep(3)
return x*x
if __name__ == "__main__":
p = ThreadPool(5)
pool_output = p.map(hello, range(3))
print(pool_output)
我看到了以下的輸出:
hi outside of main()
inside hello()
inside hello()
Proccess id: 15204
Proccess id: 15204
inside hello()
Proccess id: 15204
[0, 1, 4]
我的疑問句系統蒸發散:
爲什麼「外__main __()」運行在
Pool
每一次?multiprocessing.pool.ThreadPool
不產生新的進程?它只是創建新的線程?如果是這樣,使用
multiprocessing.pool.ThreadPool
而不僅僅是threading
模塊之間的區別是什麼?
我沒有看到任何正式的文檔,隨時隨地ThreadPool
,有人可以幫助我在哪裏可以找到它?
據我所知,由於Python中的GIL,Python的多線程看起來像多線程,但它不是真實的。如果你想利用Python的多核心,你需要使用多處理。在現代計算機中,創建進程和創建線程的成本幾乎相同。 – Yves
創建線程可能與創建進程的成本相似,但線程之間的通信與進程之間的通信的成本差別很大(除非可能使用共享內存)。此外,您對GIL的評論僅部分爲真:它在I/O操作期間以及由某些庫(例如numpy)發佈,即使在CPU限制操作期間也是如此。儘管如此,GIL最終是在Python中使用單獨進程的原因。 –