Jaka jest różnica między ThreadPool
i Pool
w module multiprocessing
. Kiedy próbuję mój kod na zewnątrz, to jest główna różnica widzę:Jaka jest różnica między ThreadPool a Pool w module wieloprocesorowym 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)
widzę następujący wynik:
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]
z "puli wątków":
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)
widzę następujące wyjście:
hi outside of main()
inside hello()
inside hello()
Proccess id: 15204
Proccess id: 15204
inside hello()
Proccess id: 15204
[0, 1, 4]
Moje pytania ia są:
dlaczego jest „poza __main __()” prowadzony za każdym razem w
Pool
?multiprocessing.pool.ThreadPool
nie odradza nowych procesów? Po prostu tworzy nowe wątki?Jeśli tak, to jaka jest różnica między używaniem
multiprocessing.pool.ThreadPool
, a nie tylko modułuthreading
?
Nie widzę żadnej oficjalnej dokumentacji dla ThreadPool
w dowolnym miejscu, czy ktoś może mi pomóc, gdzie mogę ją znaleźć?
Jak wiem, z powodu GIL w Pythonie, wielowątkowość Pythona wygląda jak wielowątkowy, ale nie jest prawdziwy. Jeśli chcesz skorzystać z wielu rdzeni z pythonem, musisz użyć wielu procesów. W nowoczesnym komputerze tworzenie procesu i tworzenie wątku ma prawie taki sam koszt. – Yves
Tworzenie wątku może mieć podobny koszt do tworzenia procesu, ale komunikacja między wątkami ma bardzo różny koszt komunikacji między procesami (chyba że używasz pamięci współdzielonej). Również twoja uwaga na temat GIL jest tylko częściowo prawdziwa: jest uwalniana podczas operacji we/wy i niektórych bibliotek (na przykład numpy) nawet podczas operacji związanych z CPU. Mimo to GIL jest ostatecznie powodem używania oddzielnych procesów w Pythonie. –