Dlaczego powinienem znać programowanie równoległe?

17

Jednoczesne programowanie jest dla mnie dość trudne: nawet spojrzenie na podstawowy slajd wydaje mi się trudne. To wydaje się takie abstrakcyjne.

Jakie są korzyści z dobrze znanej koncepcji programowania współbieżnego? Czy pomoże mi to w regularnym, sekwencyjnym programowaniu? Wiem, że zrozumienie zasad działania naszych programów jest satysfakcjonujące, ale co jeszcze?

Adel
źródło
3
Myślę, że to trochę dziwaczne, ale może być trochę topiczne, jeśli edytujesz wszystkie rzeczy osobiste (chociaż jednoczesne programowanie jest dość trudne dla wszystkich ) i poprosisz o konkretne zalety techniczne tych koncepcji.
yannis
1
Korzyści powinny być dość oczywiste. Możesz pisać programy, które mogą korzystać ze wszystkich ulepszeń wydajności dostępnych poprzez podział pracy oferowany przez programowanie współbieżne. To nie jest łatwe dla nikogo. To dziś bardzo trudna koncepcja.
Rig
3
Nie możemy pomóc ci zdobyć motywacji, aby się czegoś nauczyć, ale ogólne pytanie, dlaczego należy wiedzieć o współbieżności, jest wystarczająco tematyczne.
2
Znam programowanie równoległe. Mogę powiedzieć, że dostarczony slajd nie pomaga zrozumieć. Zamiast tego idź na imprezę z filozofami kulinarnymi .
mouviciel
1
Zrelaksuj się, nawet największym trudno jest: informit.com/articles/article.aspx?p=1193856
SK-logic

Odpowiedzi:

32

Oto szybki i łatwy motywacja: Jeśli chcesz kod do niczego, ale najmniejszych, najsłabszych systemów, to będziemy pisać kod współbieżne.

Chcesz pisać dla chmury? Wystąpienia obliczeniowe w chmurze są niewielkie. Nie dostajesz dużych, dostajesz wiele małych. Nagle twoja mała aplikacja internetowa jest aplikacją równoległą. Jeśli dobrze to zaprojektowałeś, możesz po prostu wrzucić więcej serwerów w miarę zdobywania klientów. W przeciwnym razie musisz nauczyć się, w jaki sposób podczas instancji ustalana jest średnia wartość obciążenia.

OK, chcesz pisać aplikacje komputerowe? Wszystko ma procesor z dwoma lub więcej rdzeniami. Z wyjątkiem najtańszych maszyn. A ludzie z najtańszymi maszynami prawdopodobnie nie zamierzają rozwodzić się nad twoim drogim oprogramowaniem, prawda?

Może chcesz tworzyć aplikacje mobilne? Hej, iPhone 4S ma dwurdzeniowy procesor. Reszta nie pozostanie daleko w tyle.

Gry wideo? Xbox 360 to system wieloprocesorowy, a PS3 Sony to w zasadzie system wielordzeniowy.

Po prostu nie możesz oderwać się od programowania równoległego, chyba że pracujesz nad drobnymi, prostymi problemami.

Aktualizacja 2016 : Obecna wersja Raspberry Pi za 35 USD jest zbudowana wokół czterordzeniowego systemu na chipie przeznaczonym do telefonów komórkowych. Dramatyczne postępy w sztucznej inteligencji zostały częściowo osiągnięte dzięki dostępności wysokiej klasy kart graficznych jako równoległych silników obliczeniowych.

ObscureRobot
źródło
1
Chociaż w zasadzie się zgadzam, stwierdzenie, że Everything has a dual-or-more-core-CPU. Except the least expensive machines.wydaje się to trochę niedorzeczne. Wiele osób ma maszyny jednordzeniowe, nie dlatego, że było tanie, ale dlatego, że są zadowolone z tego, co mają i nie widzą potrzeby aktualizacji. Powiedział, że myślenie w kategoriach współbieżności pomoże planującego na pojedynczym rdzeniem systemu, tak więc nie jest zmarnowany wysiłek wszędzie można założyć poboru wielozadaniowość, albo (co jest o każdym środowisku wielozadaniowym większość deweloperów wejdzie w kontakt, w te dni).
CVn
1
ok - to trochę przesada, ale nowy sprzęt przeważnie jest wielordzeniowy. Nie widzę, żeby to odchodziło. Więc jeśli jesteś studentem dzisiaj myślącym o pracy, którą będziesz wykonywać zawodowo w przyszłości, można bezpiecznie założyć, że będziesz pracować na systemach wielordzeniowych.
ObscureRobot
Zastanawiam się, czy nie zgadzam się z twoją odpowiedzią tak samo, jak nie zgadzasz się z moim
1
W moim odczuciu istnieje jądro podobieństwa do tego, co mówimy: @ acidzombie24. Mówię, że programista powinien wiedzieć, jak radzić sobie z współbieżnością, ponieważ będzie wszędzie. Mówisz, że nie musisz być dobry w programowaniu współbieżnym, dopóki ... unikniesz pułapek współbieżnych systemów :)
ObscureRobot
Zgadzam się, że bardzo przydatna jest wiedza na temat współbieżności, ale nie zgadzam się, że można od niej uciec tylko w przypadku „drobnych, prostych problemów”. Możesz uciec od współbieżności, nawet w nie-trywialnych systemach, na przykład, jeśli polegasz na istniejących ramach i serwerach aplikacji. Po wdrożeniu infrastruktury mogę zostać młodszym programistą piszącym nowe usługi dla aplikacji sieci web i wiedzieć prawie NIC o współbieżności lub równoległości.
Andres F.
21

Od 1970 do około 2002 procesory podwajały prędkość co około 18 miesięcy. Jako programista musiałeś tylko poczekać, a program pójdzie szybciej. Problem polega na tym, że około 2002 roku reguły się zmieniły. Teraz nie robią większych szybkich procesorów, robią mniejsze wolniejsze procesory, ale dzielą je na grupy. Komputer, nad którym pracuję, ma teraz 4 rdzenie i istnieją układy z maksymalnie 8 rdzeniami (i 4 wątkami na rdzeń). Wkrótce będziemy mieli chipy z dużo większą liczbą rdzeni.

Więc jeśli napiszesz program, który wcale nie jest współbieżny, przekonasz się, że używasz 1 rdzenia lub wątku, ale reszta procesora tam siedzi i nic nie robi. Więc jeśli masz 16 rdzeni, 1 uruchomi twój program, a pozostałe 15 tam będzie!

Problem z współbieżnością polega na tym, że nie jest deterministyczna. To znaczy, że nie wiesz dokładnie, w jakiej kolejności będą działać różne wątki. Tradycyjnie programiści próbowali rozwiązać to za pomocą blokad i tym podobnych. Doprowadziło to do DUŻEGO bólu. Posiadanie jakiejś formy stanu zmiennego, do którego więcej niż jeden wątek ma swobodny dostęp, jest często formułą na ból i heisnebugs!

Ostatnio trendem jest przechodzenie na funkcjonalne języki, które ściśle kontrolują stan zmiennych. Istnieją dwa podstawowe sposoby obsługi współbieżności przez języki funkcjonalne. Pierwszy polega na przekazywaniu wiadomości. Najlepiej pokazuje to Erlang. W Erlang ogólnie nie ma stanu współdzielonego między procesami. Komunikują się nie poprzez dzielenie się pamięcią, ale moje przekazywanie wiadomości. Powinno to mieć dla ciebie sens, ponieważ robimy to teraz. Przesyłam ci te informacje, wysyłając wiadomość, a nie przez to, że pamiętasz ją z mojego mózgu! Przełączając się na przekazywanie wiadomości, większość błędów blokujących po prostu odchodzi. Ponadto wiadomości mogą być przekazywane przez sieć, jak również w ramach jednego węzła.

Inną metodą jest STM, która oznacza Software Transcriptional Memory, która jest obecna w clojure i Haskell (i innych). W STM pamięć jest współdzielona, ​​ale zmiany można wprowadzać tylko poprzez transakcję. Ponieważ ludzie z bazy danych odkryli wszystkie te rzeczy w latach siedemdziesiątych, dość łatwo jest zapewnić, że wszystko będzie dobrze.

Właściwie to trochę uprościłem, zarówno Clojure, jak i Haskell potrafią przekazywać wiadomości, a Erlang potrafi STM.

Oświadczenie Jestem autorem Programowania serwisów internetowych z Erlang , które będą dostępne we wczesnej wersji za kilka tygodni.

Zachary K.
źródło
1
@Zachary K: czy istnieją podejścia łączące języki funkcjonalne z językami ojczystymi, aby części wymagające intensywnych obliczeń zostały zaimplementowane w języku ojczystym, ale zapewniają interfejsy, które mogą być używane przez serwer napisany w języku funkcjonalnym?
rwong
Nie jestem w 100% pewien, ale w JVM istnieją zarówno Clojure, jak i Scala, więc od tego chciałbym zacząć. Może zajrzyj do frameworka Akka. Nie korzystałem z niej, ale jakiś czas temu słuchałem rozmowy o Akce i wygląda na to, że może być całkiem fajna. Na razie robię Erlang i JavaScript, co zajmuje większość mojego czasu!
Zachary K
1
@rwong: .NET pozwala programistom używać C # lub innych niefunkcjonalnych języków dla niektórych części ich aplikacji oraz F #, języka funkcjonalnego dla innych.
Kevin
5

Ponieważ współbieżność może wybuchnąć ci w twarz, gdy najmniej się tego spodziewasz ...

fortran
źródło
4
+10000000000000000000000000000000000000000
8
Współbieżność to nowa hiszpańska inkwizycja [/ python] [jak w: nikt się nie spodziewa ...]
ObscureRobot
1
@ObscureRobot dwa razy tak zabawnie! (wyjaśnienie nie było potrzebne :-p)
fortran
4

Pierwszą zasadą równoczesnego programowania jest „To trudne”. Drugą zasadą równoczesnego programowania jest „It. Is. Difficult” .. !!

Poważnie, istnieją dwa powszechne podejścia do programowania współbieżnego, wielowątkowości i wieloprocesorowości. Przetwarzanie wieloprocesorowe jest najłatwiejsze do zrozumienia, ponieważ oznacza to po prostu uruchomienie wielu instancji procesu w celu wykonania zadania. Jest to dość łatwe w systemach opartych na Uniksie za pomocą wywołań do fork / join, ale nie jest tak łatwe w systemach Windows.

Wielowątkowość jest prawdopodobnie podejściem, o którym myśli większość ludzi, mówiąc o współbieżności. Rozpoczynanie wielu wątków w aplikacji nie jest trudne, ale diabeł tkwi w szczegółach. Musisz koordynować udostępnianie danych między wątkami (zwykle przy użyciu blokad), co może prowadzić do impasu lub danych w niepoprawnym stanie. Musisz także zrozumieć, jak komunikować się między wątkami za pomocą pojęć takich jak semafory, zmienne warunkowe itp.

Zaletą tego wszystkiego jest to, że kiedy to zrozumiesz, będziesz w stanie efektywniej wykorzystać podstawowy sprzęt. W dzisiejszych czasach procesor ma wiele rdzeni. Korzystając z programowania współbieżnego, możesz sprawić, aby te rdzenie działały dla Ciebie, a Twoja aplikacja uzyska poprawę prędkości.

Wadą jest to, że musisz zacząć myśleć o tym, jak podzielisz swoją aplikację na małe części, które można uruchomić na różnych wątkach. To jest o wiele trudniejsze niż się wydaje. Również wysoce współbieżne rozwiązania mogą być niewygodne w testach jednostkowych, ponieważ kolejność wykonywania jest mniej deterministyczna.

W dzisiejszych czasach większość języków zawiera abstrakcję większości współistniejących prymitywów, aby ułatwić życie. Na przykład .NET 4 jest dostarczany z biblioteką zadań równoległych, która ułatwia życie. W krainie Java mają pakiet Concurrency .

Sean
źródło
1
Otrzymuje rzędy wielkości, jeśli uciekniesz od zamków tak szybko, jak to możliwe. Użyj STM lub aktorów, a wszystko, co powiedziałeś, zniknie. Oczywiście oznacza to odejście od Javy do języków takich jak Scala, Erlang lub Clojure. (choć twierdziłbym, że to także dobra rzecz)
Zachary K
@Zachary: To może być dobra rzecz, ale jeśli na przykład pracujesz w sklepie .NET, nie jest to praktyczne. STM może być opcją w przyszłości, ale obecnie nie jest to opcja w głównych językach.
Sean
Clojure działa na .net, i jest F #. Założę się, że istnieją również implementacje STM dla C #.
Zachary K
3

Niedawno miałem bardzo interesujące zadanie, w którym uratowało mnie przetwarzanie wieloprocesowe. Zasadniczo musiałem wykonać wiele żądań do kilku oddzielnych serwerów, zajmując się bardzo małymi ilościami danych, ale wieloma żądaniami.

Pracując z PHP, robiłem rzeczy w staromodny sposób, a najlepszy czas, jaki uzyskałem po kilku godzinach pracy, przyniósł około 120 sekund na uruchomienie określonego testu (wiele żądań + opóźnienie sieci + brak asynchronizacji)

Ale to nie było prawie wystarczające w porównaniu z tym, czego potrzebowałem, a po nieudanej próbie wieloprocesowości PHP przełączyłem się na Python.

Po kilku godzinach miałem działający skrypt wieloprocesowy w Pythonie, który działał w 20 sekund, a po trochę majstrowania przy limitach czasu i nie. wątków, które mają być użyte, zmniejszyłem to do ~ 10 sekund .

Dotyczyło to witryny napisanej w 100% w języku PHP, z wyjątkiem jednego, 100-wierszowego skryptu w języku Python. A wszystko działa idealnie.

Doszedłem do wniosku , że nawet jeśli nie pomoże ci to na co dzień, możesz napotkać sytuacje, w których znajomość podstaw programowania równoległego bardzo ci pomoże.

Powodzenia i szczęśliwego kodowania!

PS: Nie próbuję obalić PHP, ale PHP po prostu nie było odpowiednim narzędziem do danego zadania.

PS2: Znajomość nowej technologii lub nowego sposobu robienia rzeczy może otworzyć drzwi do zupełnie nowego świata możliwości.

Vlad Preda
źródło
2

Jeśli zajmujesz się tworzeniem stron internetowych, w grę wchodzi współbieżność, przynajmniej w większości języków. Na przykład używam sprężyny do tworzenia stron internetowych i każde nowe żądanie pojawia się jako własny wątek. Dlatego jeśli jakiekolwiek żądanie kończy się dostępem do współdzielonego obiektu, w którym można zmienić stan zmiennej, współbieżność jest bardzo istotnym czynnikiem i należy ją wziąć pod uwagę. Jeśli nie, dane można edytować w nieprzewidywalny sposób, co może spowodować uszkodzenie danych. Nie jest ważne, aby znać każdy szczegół na temat współbieżności, ale nauka elementów na raz jest ważna, aby lepiej zrozumieć programowanie aplikacji internetowych, jeśli pracujesz na aplikacjach komputerowych, być może nie jest to tak ważne, chyba że musisz uruchomić wiele wątków

programmx10
źródło
-1

Dowiedz się wgląd w systemy operacyjne. Pomoże odczytać kod źródłowy harmonogramów i sterowników urządzeń; są zdecydowanie zbieżne.

jj1bdx
źródło
2
Współbieżność dla programistów zwykle dotyczy własnych programów działających w wielu instancjach.
Próbowałem podkreślić, że i tak nie można napisać własnego programu współbieżnego bez znajomości szczegółów algorytmu szeregowania jądra systemu operacyjnego.
jj1bdx
Dlaczego nie? Jeśli poprawnie korzystasz z mechanizmów blokujących, algorytm planowania systemu operacyjnego jest nieistotny.