Okazało się, że w Pythonie 3.4 istnieje kilka różnych bibliotek dla wieloprocesorowe / gwintowania: wieloprocesorowe vs gwintowania vs asyncio .
Ale nie wiem, którego użyć, czy jest to „zalecane”. Czy robią to samo, czy różnią się? Jeśli tak, który z nich jest używany do czego? Chcę napisać program korzystający z wielu rdzeni w moim komputerze. Ale nie wiem, której biblioteki powinienem się nauczyć.
python
multithreading
python-3.x
multiprocessing
python-asyncio
user3654650
źródło
źródło
Odpowiedzi:
Są przeznaczone do (nieco) innych celów i / lub wymagań. CPython (typowa, główna implementacja Pythona) nadal ma globalną blokadę interpretera, więc aplikacja wielowątkowa (obecnie standardowy sposób implementacji przetwarzania równoległego) jest nieoptymalna. Dlatego
multiprocessing
może być preferowanythreading
. Jednak nie każdy problem można skutecznie podzielić na [prawie niezależne] części, więc może zaistnieć potrzeba intensywnej komunikacji międzyprocesowej. Dlategomultiprocessing
może nie być preferowanythreading
w ogóle.asyncio
(ta technika jest dostępna nie tylko w Pythonie, inne języki i / lub frameworki również ją mają, np. Boost.ASIO ) to metoda na efektywną obsługę wielu operacji I / O z wielu jednoczesnych źródeł bez potrzeby równoległego wykonywania kodu . Jest to więc tylko rozwiązanie (rzeczywiście dobre!) Do konkretnego zadania, a nie ogólnie do przetwarzania równoległego.źródło
[Szybka odpowiedź]
TL; DR
Dokonanie właściwego wyboru:
if io_bound: if io_very_slow: print("Use Asyncio") else: print("Use Threads") else: print("Multi Processing")
Odniesienie
[ UWAGA ]:
asyncio
pętli zdarzenia ( uvloop sprawiaasyncio
2-4x szybciej).[UPDATE (2019)]:
źródło
asyncio
kiedy korzystasz z funkcji oczekujących,request
biblioteka nie jest metodą oczekiwaną, zamiast tego możesz użyćaiohttp
biblioteki lub żądania asynchronicznego itp.Oto podstawowa idea:
Więc zasadniczo trzymaj się wątków, chyba że masz problemy z IO / CPU.
źródło
W przypadku przetwarzania wieloprocesowego do dystrybucji obliczeń wykorzystuje się wiele procesorów. Ponieważ każdy z procesorów działa równolegle, możesz skutecznie wykonywać wiele zadań jednocześnie. Chciałbyś użyć przetwarzania wieloprocesowego do zadań związanych z procesorem . Przykładem może być próba obliczenia sumy wszystkich elementów ogromnej listy. Jeśli twoja maszyna ma 8 rdzeni, możesz "pociąć" listę na 8 mniejszych list i obliczyć sumę każdej z tych list oddzielnie na oddzielnym rdzeniu, a następnie po prostu zsumować te liczby. W ten sposób uzyskasz ~ 8x przyspieszenie.
W wielu) ( gwintnie potrzebujesz wielu procesorów. Wyobraź sobie program, który wysyła do sieci wiele żądań HTTP. Jeśli użyłeś programu jednowątkowego, zatrzymałby on wykonywanie (blok) przy każdym żądaniu, czekał na odpowiedź, a następnie kontynuował po otrzymaniu odpowiedzi. Problem polega na tym, że twój procesor tak naprawdę nie działa, czekając, aż jakiś zewnętrzny serwer wykona zadanie; w międzyczasie mógł wykonać pożyteczną pracę! Rozwiązaniem jest użycie wątków - możesz utworzyć wiele z nich, z których każdy będzie odpowiadał za żądanie treści z sieci. Zaletą wątków jest to, że nawet jeśli działają one na jednym procesorze, procesor od czasu do czasu „zawiesza” wykonanie jednego wątku i przeskakuje do wykonania drugiego (nazywa się to przełączaniem kontekstu i dzieje się to stale niedeterministycznie odstępach czasu). - użyj gwintowania.
asyncio to w zasadzie wątkowanie, w którym to nie procesor, ale ty, jako programista (a właściwie twoja aplikacja), decydujesz, gdzie i kiedy ma nastąpić przełączenie kontekstu . W Pythonie używasz
await
słowa kluczowego, aby zawiesić wykonanie twojego programu (zdefiniowanego za pomocąasync
słowa kluczowego).źródło