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 tylko threading modułu?

Nie widzę nigdzie żadnej oficjalnej dokumentacji ThreadPool, Czy ktoś może mi pomóc, Gdzie mogę ją znaleźć?

Author: martineau, 2017-09-05

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.

 92
Author: noxdafox,
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