Multiprocessing vs Threading Python

Staram się zrozumieć zalety multiprocessing over threading. Wiem, że multiprocessing obraca się wokół globalnej blokady interpretera, ale jakie są inne zalety i czy threading może nie robić tego samego?

Author: Tshepang, 2010-06-15

8 answers

Moduł threading używa wątków, moduł multiprocessing używa procesów. Różnica polega na tym, że wątki działają w tej samej przestrzeni pamięci, podczas gdy procesy mają oddzielną pamięć. To sprawia, że nieco trudniej jest współdzielić obiekty między procesami z wieloma procesami. Ponieważ wątki używają tej samej pamięci, należy podjąć środki ostrożności lub dwa wątki będą zapisywać do tej samej pamięci w tym samym czasie. Do tego służy globalna blokada interpretera.

Proces tarła jest nieco wolniejszy od tarła wątków. Gdy już biegną, nie ma dużej różnicy.
 503
Author: Sjoerd,
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
2017-04-17 19:18:05

Oto kilka plusów/minusów, które wymyśliłem.

Multiprocessing

Plusy

  • oddzielna przestrzeń pamięci
  • kod jest zwykle prosty
  • wykorzystuje wiele procesorów i rdzeni
  • unika ograniczeń GIL dla cPython
  • W przeciwieństwie do tego, w jaki sposób użytkownicy mogą korzystać z pamięci współdzielonej, nie są w stanie korzystać z tego samego modelu komunikacji.]}
  • procesy potomne są przerywalne / zabijalne
  • Python multiprocessing moduł zawiera przydatne abstrakcje z interfejsem podobnym do threading.Thread
  • musi z cPython do przetwarzania związanego z CPU

Cons

    IPC nieco bardziej skomplikowane z większym obciążeniem (model komunikacji w porównaniu z pamięcią dzieloną/obiektami)
  • większy ślad pamięci

Gwintowanie

Plusy

  • Lightweight-low memory footprint
  • pamięć Dzielona-umożliwia dostęp do stanu z innego kontekstu easier
  • pozwala na łatwe tworzenie responsywnych interfejsów użytkownika
  • moduły rozszerzeń cPython C, które poprawnie zwalniają GIL, będą działać równolegle
  • świetna opcja dla aplikacji związanych z I / O

Cons

  • cPython-subject to the GIL
  • nie przerywa / zabija
  • jeśli nie postępujemy zgodnie z modelem kolejki poleceń/komunikatu (używając modułu Queue), to ręczne użycie synchronizacji staje się koniecznością (decyzje są potrzebne do ziarnistość zamka)
  • Kod jest zwykle trudniejszy do zrozumienia i poprawienia - potencjał warunków wyścigowych drastycznie wzrasta]}
 669
Author: Jeremy Brown,
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
2010-06-15 14:39:02

Zadaniem Threadingu jest umożliwienie aplikacji responsywnych. Załóżmy, że masz połączenie z bazą danych i musisz odpowiedzieć na dane wejściowe użytkownika. Bez wątku, jeśli połączenie z bazą danych jest zajęte, aplikacja nie będzie w stanie odpowiedzieć użytkownikowi. Rozdzielając połączenie z bazą danych w osobny wątek, możesz zwiększyć responsywność aplikacji. Również dlatego, że oba wątki są w tym samym procesie, mogą uzyskać dostęp do tych samych struktur danych - dobra wydajność, Plus elastyczny Projektowanie oprogramowania.

Zauważ, że ze względu na GIL aplikacja nie robi dwóch rzeczy na raz, ale to, co zrobiliśmy, to umieścić blokadę zasobów w bazie danych w osobnym wątku, aby czas procesora mógł być przełączany między nim a interakcją użytkownika. Czas procesora jest racjonowany pomiędzy wątkami.

Multiprocessing jest dla czasów, kiedy naprawdę chcesz więcej niż jedną rzecz do zrobienia w danym momencie. Załóżmy, że Twoja aplikacja musi połączyć się z 6 bazami danych i wykonać złożone transformacja macierzy na każdym zbiorze danych. Umieszczenie każdego zadania w osobnym wątku może trochę pomóc, ponieważ gdy jedno połączenie jest bezczynne, Inne może uzyskać trochę czasu procesora, ale przetwarzanie nie będzie odbywać się równolegle, ponieważ GIL oznacza, że używasz tylko zasobów jednego procesora. Umieszczając każde zadanie w procesie wieloprocesorowym, każde może działać na własnym procesorze i działać z pełną wydajnością.

 165
Author: Simon Hibbs,
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
2010-06-15 13:38:10

Kluczową zaletą jest izolacja. Crashing process nie obniży innych procesów, podczas gdy crashing thread prawdopodobnie sieje spustoszenie w innych wątkach.

 35
Author: Marcelo Cantos,
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
2010-06-15 11:15:29

Inną rzeczą nie wspomnianą jest to, że zależy to od tego, jakiego systemu operacyjnego używasz, gdy chodzi o szybkość. W Windows procesy są kosztowne, więc wątki byłyby lepsze w windows, ale w unix procesy są szybsze niż ich warianty windows, więc korzystanie z procesów w unix jest znacznie bezpieczniejsze i szybkie do spawnowania.

 24
Author: chrissygormley,
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
2010-06-15 11:22:41

Inne odpowiedzi skupiały się bardziej na aspekcie wielowątkowości vs wielowątkowości, ale w Pythonie należy wziąć pod uwagę globalną blokadę interpretera (GIL). Gdy tworzone są kolejne liczby (np. k) wątków, zazwyczaj nie zwiększają one wydajności o K razy, ponieważ nadal będą działać jako pojedyncza aplikacja z wątkiem. GIL jest globalną blokadą, która blokuje wszystko i pozwala na wykonanie tylko jednego wątku z wykorzystaniem tylko jednego rdzenia. Na wydajność wzrasta w miejscach, gdzie używane są rozszerzenia C, takie jak numpy, Network, I/O, gdzie wykonuje się wiele pracy w tle i wypuszcza GIL.
więc kiedy threading jest używany, istnieje tylko jeden wątek na poziomie systemu operacyjnego, podczas gdy python tworzy pseudo-wątki, które są całkowicie zarządzane przez sam wątek, ale zasadniczo działają jako pojedynczy proces. Preemption odbywa się pomiędzy tymi pseudo wątkami. Jeśli procesor pracuje z maksymalną pojemnością, możesz zmienić do multiprocessingu.
Teraz w przypadku samodzielnych wystąpień wykonania, możesz zamiast tego zdecydować się na pool. Ale w przypadku nakładania się danych, gdzie możesz chcieć, aby procesy się komunikowały, powinieneś użyć multiprocessing.Process.

 12
Author: Chitransh Gaurav,
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
2018-05-29 10:50:48

Jak wspomniano w Pythonie, Multiprocessing w Pythonie jest jedynym prawdziwym sposobem osiągnięcia prawdziwej równoległości. wielowątkowość nie może tego osiągnąć, ponieważGIL zapobiega równoległemu działaniu wątków.

W konsekwencji, threading może nie zawsze być użyteczny w Pythonie, a w rzeczywistości może nawet skutkować gorszą wydajnością w zależności od tego, co próbujesz osiągnąć. Na przykład, jeśli wykonujesz CPU-bound zadanie, takie jak dekompresja gzip pliki lub renderowanie 3D (wszystko, co obciąża procesor), a następnie wątek może faktycznie utrudnić wydajność, a nie pomóc. W takim przypadku powinieneś użyć Multiprocessing , ponieważ tylko ta metoda działa równolegle i pomoże w rozłożeniu wagi danego zadania. Może to być trochę naglące, ponieważ Multiprocessing polega na skopiowaniu pamięci skryptu do każdego podprocesu, co może powodować problemy dla większych aplikacji.

Jednak, wielowątkowość staje się przydatna, gdy twoje zadanie jestzwiązane z IO . Na przykład, jeśli większość twojego zadania polega na oczekiwaniu na API-calls , użyjesz wielowątkowości , ponieważ dlaczego nie uruchomisz kolejnego żądania w innym wątku podczas oczekiwania, a nie każesz procesorowi siedzieć bezczynnie.

TL; DR

  • Jest on używany do wykonywania zadań związanych z IO, związanych z Io, związanych z Io, związanych z Io, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO, związanych z IO.]}
  • Multiprocessing osiąga prawdziwą równoległość i jest używany dla CPU-bound zadania
 1
Author: Bolboa,
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
2018-09-10 19:26:17

Proces może mieć wiele wątków. Wątki te mogą współdzielić pamięć i są jednostkami wykonania w procesie.

Procesy działają na CPU, więc wątki znajdują się pod każdym procesem. Procesy to pojedyncze jednostki, które działają niezależnie. Jeśli chcesz udostępnić dane lub stan między każdym procesem, możesz użyć narzędzia pamięci masowej, takiego jak Cache(redis, memcache), Files, lub Database.

 1
Author: Satya Srinivasu Rankireddy,
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
2018-09-19 23:22:50