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?
concurrency
Adel
źródło
źródło
Odpowiedzi:
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.
źródło
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).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.
źródło
Ponieważ współbieżność może wybuchnąć ci w twarz, gdy najmniej się tego spodziewasz ...
źródło
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 .
źródło
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.
źródło
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
źródło
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.
źródło