Dalej w współbieżności

9

Przez ostatni rok dużo pracowałem nad współbieżnością w Javie i zbudowałem i pracowałem nad wieloma współbieżnymi pakietami. Jeśli chodzi o rozwój we współczesnym świecie, jestem całkiem pewny. Ponadto jestem bardzo zainteresowany, aby dowiedzieć się więcej na temat programowania równoległego.

Ale nie jestem w stanie odpowiedzieć sobie, co dalej? Czego powinienem się nauczyć lub pracować, aby odziedziczyć więcej umiejętności związanych z przetwarzaniem wielordzeniowym. Czy jest jakaś fajna książka (przeczytana i podobająca się „współbieżność w praktyce” i „współbieżne programowanie w Javie”) lub zasoby związane z przetwarzaniem wielordzeniowym, aby przejść do następnego poziomu?

Jatin
źródło
Jeśli opuściłeś teoretyczne podstawy, naucz się ich teraz: en.wikipedia.org/wiki/Pi-calculus
SK-logic

Odpowiedzi:

8

Oświadczenie - nie jestem ekspertem od współbieżności, ale moim współautorem jest, papuguję go :-)

Odkąd przeczytałeś książki Douga Lei i Briana Goetza, zdecydowanie umieściłeś najlepsze dostępne materiały.

Idąc dalej, pojawiły się nowe ulepszenia współbieżności w Javie 7. Najbardziej zauważalne są ramy Fork / Join i nowe asynchroniczne interfejsy API NIO.

Java 8 wprowadzi dalsze ulepszenia współbieżności z kolekcjami lambdas / równoległymi.

Inną rzeczą, na którą należy poważnie spojrzeć, są alternatywne sposoby radzenia sobie z współbieżnością. Mówiąc wprost, podejście Java do blokowania obiektów podlegających mutacji zawsze będzie podatne na błędy, bez względu na to, jak bardzo interfejsy API zostaną ulepszone. Dlatego zalecam przyjrzenie się modelowi aktorskiemu Scali i STM Clojure'a jako alternatywnym sposobom radzenia sobie z problemami współbieżności przy jednoczesnym zachowaniu interoperacyjności z Javą.

[ostrzeżenie -> autoreklama] Więc naturalnie polecę naszą nadchodzącą książkę, The Well-Grounded Java Developer , która obejmuje wszystkie rzeczy, o których wspomniałem powyżej: -). [/ warning]

Aby nie zapomnieć, Groovy ma również wysoce zalecaną bibliotekę Gpars, ale nie korzystałem z niej osobiście.

Martijn Verburg
źródło
Ha wielkie dzięki za książkę :). Czy możesz również zasugerować inną dobrą książkę, ponieważ zalecana książka nie jest dostępna tutaj (wydanie lokalne) w Indiach. PS: Współbieżność w praktyce to klejnot książki
Jatin,
@Martijn, Neat! Od jakiegoś czasu ciekawi mnie Groovy i Scala i chciałem się z nim bawić, aby dowiedzieć się więcej. Czy twoja książka jest skierowana do początkujących w tych językach, czy też zakłada wcześniejsze doświadczenie?
maple_shaft
@Jatin Puri - Naprawdę nie znam żadnych innych tytułów na temat „współbieżności w praktyce” i „współbieżnego programowania w java”, jest tytuł O'Reilly autorstwa Henry'ego Wonga „Java Threads”.
Martijn Verburg
@maple_shift - Jest skierowany do początkujących :-)
Martijn Verburg
2

Język programowania D zapewnia dwa paradygmaty programowania współbieżnego, które mają swoje zastosowania i są dość interesujące.

std.concurrency zapewnia przekazywanie wiadomości bez domyślnego udostępniania pamięci. Wszystkie globalne i statyczne zmienne w D są domyślnie lokalne dla wątków spawni sendnie pozwalają na wysyłanie wiadomości zawierających zmienną pośrednią wskazówkę. Ograniczone udostępnianie można uzyskać za pomocą sharedsłowa kluczowego, co pociąga za sobą dodatkowe sprawdzenie przez system typów. Poza bezpiecznym dialektem języka możesz wymusić klasyczne zmienne globalne / wspólne w stylu C / Java za pomocą __gsharedsłowa kluczowego, ale wszystkie zakłady są wyłączone w zakresie bezpieczeństwa wyścigu. Model ten został szczegółowo opisany w wolnym rozdziale książki Andrei Alexandresu „The D Programming Language”.

równoległość std jest mniej bezpieczna, ale pod pewnymi względami bardziej elastyczna niż współbieżność std. i jest specjalnie dostosowana do danych wielordzeniowych i równoległości zadań w celu zwiększenia przepustowości przetwarzania danych zamiast współbieżności ogólnej. Posiada równoległą pętlę foreach, asynchroniczne wywołania funkcji, równoległe redukcje itp. Zapewnia mechanizmy ułatwiające pisanie kodu bezpiecznego dla wyścigu, ale nadal wymaga to pewnej dyscypliny.

Dokładniejszą dyskusję na temat dwóch głównych paradygmatów wielowątkowości w D można znaleźć w moim ostatnim artykule na ten temat.

dsimcha
źródło
2

Zdecydowanie sugeruję, abyś poszedł i spojrzał na Clojure

Podejście do współbieżności jest bardzo nowatorskie i moim zdaniem znaczny postęp w stosunku do tego, co widzisz w Javie i większości innych języków. Niektóre kluczowe punkty:

  • Tożsamość i stan są rozdzielone - OOP łączy tożsamość obiektu z jego aktualnym stanem w postaci zmiennych zmiennych składowych. Clojure ściśle oddziela tożsamość (zarządzane referencje) i stan (niezmienne struktury danych) w sposób, który znacznie upraszcza tworzenie niezawodnych programów współbieżnych.
  • Trwałe niezmienne struktury danych - ponieważ wszystko jest niezmienne, możesz w każdej chwili zrobić migawkę danych / stanu i mieć pewność, że nie ulegnie ono mutacji pod tobą. Ale lepiej - są to trwałe struktury danych, które współużytkują dane z poprzednimi wersjami. W rezultacie operacje są znacznie bliższe O (1) niż O (n), którą zapłaciłbyś za strategię kopiowania przy zapisie dla niezmiennych danych.
  • Programowa pamięć transakcyjna - zamiast używać blokad, po prostu zamykasz kod w bloku (dosync ...) i są one automatycznie uruchamiane jako transakcja. Brak ryzyka zakleszczenia i nie ma potrzeby opracowywania złożonych strategii blokowania. To ogromna wygrana, szczególnie w połączeniu z niezmiennymi strukturami danych powyżej. W efekcie Clojure implementuje kontrolę współbieżności wielu wersji w swoim STM.
  • Funkcjonalny paradygmat programowania służy do ułatwienia pisania niezawodnego współbieżnego kodu. Zasadniczo, jeśli weźmiesz niezmienną strukturę danych, uruchomisz ją przez czystą funkcję i wyświetlisz inną niezmienną strukturę danych, wtedy twój kod będzie bezpieczny dla współbieżności.

Proponuję obejrzeć ten film jako wprowadzenie

mikera
źródło
1

Spójrz na język Scala, który rozszerza Javę i działa na JVM. Pożycza pojęcie „aktorów” od Erlanga i daje dobre możliwości radzenia sobie z awariami współbieżności.

Matthew Flynn
źródło
1

Jeśli chcesz przenieść go na zupełnie nowy poziom, możesz przyjrzeć się programowaniu w CUDA .

Pozwala to rozdzielić algorytmy na setki rdzeni przetwarzających na karcie graficznej, a nie na kilka głównych rdzeni procesora. Istnieją nawet powiązania językowe, które najwyraźniej względnie ułatwiają przyspieszenie języków wysokiego poziomu, takich jak python, przy użyciu technik GPGPU .

Mark Booth
źródło
@Chiron - Szczerze mówiąc, byłem zaskoczony, że nikt już o tym nie wspominał.
Mark Booth,