Jaka jest różnica między ThreadPool a Pool w module wieloprocesorowym?
Jaka jest różnica między ThreadPool
a Pool
w module multiprocessing
. Kiedy wypróbuję mój kod, to jest główna różnica, którą widzę:
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ące wyjście:
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 "ThreadPool":
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 to:
Dlaczego "outside _ _ main _ _ ()" jest uruchamiane za każdym razem w
Pool
?multiprocessing.pool.ThreadPool
czy nie pojawiają się nowe procesy? Tworzy nowe wątki?Jeśli tak, to jaka jest różnica pomiędzy używaniem
multiprocessing.pool.ThreadPool
w przeciwieństwie do tylkothreading
modułu?
Nie widzę nigdzie żadnej oficjalnej dokumentacji ThreadPool
, Czy ktoś może mi pomóc, Gdzie mogę ją znaleźć?
1 answers
multiprocessing.pool.ThreadPool
zachowuje się tak samo jak multiprocessing.Pool
z tą jedyną różnicą, że używa wątków zamiast procesów do uruchamiania logiki workerów.
Powód, dla którego widzisz
hi outside of main()
Wielokrotne drukowanie z multiprocessing.Pool
wynika z faktu, że pula będzie spawnować 5 niezależnych procesów. Każdy proces zainicjalizuje własny interpreter Pythona i załaduje moduł, co spowoduje ponowne uruchomienie najwyższego poziomu print
.
Zauważ, że dzieje się tak tylko wtedy, gdy spawn
stosowana jest metoda tworzenia procesu (tylko Metoda dostępna w systemie Windows). Jeśli użyjesz fork
one (Unix), zobaczysz wiadomość wydrukowaną tylko raz, tak jak dla wątków.
multiprocessing.pool.ThreadPool
nie jest udokumentowana, ponieważ jej realizacja nigdy nie została zakończona. Brak testów i dokumentacji. Jego implementację można zobaczyć w kodzie źródłowym .
Wydaje mi się, że następnym naturalnym pytaniem jest: kiedy używać puli opartej na wątkach, a kiedy na procesach?
The zasada kciuka brzmi:
- IO bound jobs - >
multiprocessing.pool.ThreadPool
- CPU bound jobs - >
multiprocessing.Pool
- zadania Hybrydowe - > zależy od obciążenia, Zwykle wolę
multiprocessing.Pool
ze względu na przewagę izolacji procesu
W Pythonie 3 możesz rzucić okiem na concurrent.future.Executor
implementacje basenów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-25 12:44:37