Jest to prawdopodobnie trywialne pytanie, ale jak zrównoleglić następującą pętlę w pythonie?
# setup output lists
output1 = list()
output2 = list()
output3 = list()
for j in range(0, 10):
# calc individual parameter value
parameter = j * offset
# call the calculation
out1, out2, out3 = calc_stuff(parameter = parameter)
# put results into correct output list
output1.append(out1)
output2.append(out2)
output3.append(out3)
Wiem, jak uruchomić pojedyncze wątki w Pythonie, ale nie wiem, jak „zbierać” wyniki.
Wiele procesów byłoby również w porządku - cokolwiek jest najłatwiejsze w tym przypadku. Używam obecnie Linuksa, ale kod powinien również działać w systemach Windows i Mac.
Jaki jest najprostszy sposób na zrównoleglenie tego kodu?
źródło
calc_stuff
?multiprocessing
modułu, aby uzyskać bardziej wyczerpujące przykłady.Pool.map()
w zasadzie działa jakmap()
, ale równolegle.W celu zrównoleglenia prostej pętli for, joblib wnosi wiele wartości do surowego wykorzystania wieloprocesowości. Nie tylko krótka składnia, ale także takie rzeczy, jak przezroczyste wiązanie iteracji, gdy są one bardzo szybkie (aby usunąć narzut) lub przechwytywanie śledzenia procesu potomnego w celu lepszego raportowania błędów.
Oświadczenie: Jestem oryginalnym autorem joblib.
źródło
Naprawdę podoba mi się
concurrent.futures
to, dostępne w Python3 od wersji 3.2 - i poprzez backport do wersji 2.6 i 2.7 na PyPi .Możesz używać wątków lub procesów i używać dokładnie tego samego interfejsu.
Wieloprocesowe
Umieść to w pliku - futuretest.py:
A oto wynik:
Wielowątkowość
Teraz zmienia
ProcessPoolExecutor
sięThreadPoolExecutor
, i ponownie uruchomić moduł:Teraz wykonałeś zarówno wielowątkowość, jak i wieloprocesowość!
Uwaga na temat wydajności i korzystania z obu razem.
Próbkowanie jest zdecydowanie zbyt małe, aby porównać wyniki.
Podejrzewam jednak, że wielowątkowość będzie szybsza niż wieloprocesowość w ogóle, szczególnie w systemie Windows, ponieważ system Windows nie obsługuje rozwidlania, więc uruchomienie każdego nowego procesu wymaga czasu. W systemie Linux lub Mac będą prawdopodobnie bliżej.
Możesz zagnieździć wiele wątków w wielu procesach, ale zaleca się, aby nie używać wielu wątków do wydzielenia wielu procesów.
źródło
Powyższe działa pięknie na moim komputerze (Ubuntu, pakiet joblib został wstępnie zainstalowany, ale można go zainstalować za pośrednictwem
pip install joblib
).Zaczerpnięte z https://blog.dominodatalab.com/simple-parallelization/
źródło
Korzystanie z Ray ma wiele zalet :
W twoim przypadku możesz uruchomić Ray i zdefiniować zdalną funkcję
a następnie wywołać to równolegle
Aby uruchomić ten sam przykład w klastrze, jedyną linią, która by się zmieniła, byłoby wywołanie ray.init (). Odpowiednia dokumentacja znajduje się tutaj .
Zauważ, że pomagam rozwijać Ray.
źródło
To najłatwiejszy sposób na zrobienie tego!
Możesz użyć asyncio . (Dokumentacja znajduje się tutaj ). Jest wykorzystywany jako podstawa dla wielu asynchronicznych struktur Pythona, które zapewniają wysokowydajne serwery sieciowe i sieciowe, biblioteki połączeń z bazami danych, rozproszone kolejki zadań itp. Ponadto posiada interfejsy API wysokiego i niskiego poziomu, aby poradzić sobie z każdym rodzajem problemu .
Teraz ta funkcja będzie uruchamiana równolegle za każdym razem, gdy zostanie wywołana, bez przełączania programu głównego w stan oczekiwania. Możesz go również użyć do równoległego tworzenia pętli. Gdy wywoływana jest pętla for, pętla jest sekwencyjna, ale każda iteracja przebiega równolegle do programu głównego, gdy tylko dojdzie do interpretera. Na przykład:
Daje to następujące wyniki:
źródło
wrapped()
i powinna być**kwargs
zamiast*kwargs
dlaczego nie używasz wątków i jednego muteksu do ochrony jednej globalnej listy?
pamiętaj, że będziesz tak szybki jak najwolniejszy wątek
źródło
Uważam, że
joblib
jest ze mną bardzo przydatny. Zobacz następujący przykład:n_jobs = -1: użyj wszystkich dostępnych rdzeni
źródło
joblib
.Powiedzmy, że mamy funkcję asynchroniczną
To musi być uruchomione na dużej tablicy. Niektóre atrybuty są przekazywane do programu, a niektóre są używane z właściwości elementu słownika w tablicy.
źródło
Zerknij na to;
http://docs.python.org/library/queue.html
To może nie być właściwy sposób, ale zrobiłbym coś takiego;
Aktualny kod;
Mam nadzieję, że to pomaga.
źródło
Może to być przydatne podczas wdrażania przetwarzania wieloprocesowego i przetwarzania równoległego / rozproszonego w języku Python.
Samouczek YouTube na temat korzystania z pakietu Techila
Techila to pośrednie oprogramowanie do przetwarzania rozproszonego, które integruje się bezpośrednio z Pythonem za pomocą pakietu techila. Funkcja brzoskwini w pakiecie może być użyteczna w równoległych strukturach pętli. (Poniższy fragment kodu pochodzi z forów społeczności Techila )
źródło
dzięki @iuryxavier
źródło
bardzo prosty przykład przetwarzania równoległego to
źródło