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.