2012-04-25 15 views
9

Czytałem interesting blog post o erlangu i modelu aktora. Słyszałem też, że Scala wspiera model aktorski. Z tego, co zgromadziłem do tej pory, model aktora przerywa przetwarzanie na komponenty, które komunikują się ze sobą przekazując wiadomości. Zazwyczaj procesy te są niezmienne.to model aktora ograniczony do określonych języków?

Czy są to cechy specyficzne dla danego języka na poziomie architektury? dokładniej, czy nie możesz po prostu zaimplementować tego samego modelu aktora w niemal dowolnym języku i po prostu użyć jakiejś formy kolejki komunikatów, aby przekazywać wiadomości między procesami roboczymi? (na przykład użyj czegoś podobnego do celery). A może języki takie jak erlang i scala po prostu robią to w sposób przejrzysty i much faster?

Odpowiedz

12

Z pewnością można zdefiniować "Bibliotekę aktorów" w praktycznie dowolnym języku, ale w Erlang model jest zapakowany do języka i jest naprawdę jedynym dostępnym modelem współbieżności.

Podczas gdy system aktorów Scali jest dobrze zaimplementowany, pod koniec dnia wciąż jest podatny na niektóre zagrożenia, na które Erlang jest odporny. Zwrócę twoją uwagę na to paper.

Tak będzie w przypadku każdej biblioteki Aktorów zaimplementowanej w jakimkolwiek imperatywnym języku, który obsługuje współużytkowany zmienny stan.

Interesującym wyjątkiem jest Nodes.js. Niektóre prace są wykonywane z aktorami pomiędzy węzłami, które prawdopodobnie wykazują te same właściwości izolacji co Erlang, po prostu dlatego, że nie ma wspólnego stanu zmiennego.

+0

Dzięki @dsmith. To interesujące. Więc jeśli to rozumiem, wspólny zmienny stan jest głównym źródłem problemów.O ile widzę, każda architektura oparta na kolejce komunikatów, która przekazuje serializowane zadania/dane do procesów roboczych, powinna być w zasadzie odporna na to. Czy zatem jest to zgodne z modelem aktora? Można zatem założyć, że np. seler już wdraża model aktorski? – gingerlime

+0

Kluczem jest izolacja zmiennego stanu. Erlang izoluje zmienny stan w procesach lekkich. Stan węzłów byłby izolowany w procesach systemu operacyjnego z pojedynczym wątkiem wykonania. I tak, rozwiązania komunikacyjne, takie jak selekcja/rabbitmq, miałyby te same cechy. – dsmith

+0

Jeszcze raz dziękuję. Przyjąłem twoją odpowiedź (wraz z dodatkowymi informacjami dostarczonymi przez @talg, co naprawdę mnie dopełniło). Mam teraz o wiele lepszy obraz o erlangu, a jednak warto wiedzieć, że model aktora może być nadal zaimplementowany (choć w nieco ograniczonej formie) z czymś takim jak python/selera/rabbitmq itp. – gingerlime

3

Model aktor jest nie ograniczony do jakiejkolwiek konkretnej platformy lub języka programowania, to przecież tylko model.

Erlang i Scala mają naprawdę dobre i użyteczne implementacje tego modelu, które ładnie pasują do typowego stosu technologicznego tych platform i pomagają skutecznie rozwiązywać niektóre rodzaje zadań.

0

Nie, w modelu aktora nie ma nic specyficznego dla języka. W rzeczywistości wspomniałeś już o Scali w swoim pytaniu, w którym aktorzy nie są częścią języka, ale są zaimplementowani jako biblioteka. (Właściwie trzy konkurujące biblioteki).

Jednak, podobnie jak programowanie funkcjonalne lub programowanie obiektowe, bezpośrednie wsparcie dla programowania aktorów lub przynajmniej wsparcie dla niektórych abstrakcji, które ułatwiają implementację, w języku będzie prowadzić do zupełnie innego doświadczenia w programowaniu. Każdy, kto kiedykolwiek zrobił Programowanie Funkcyjne lub Programowanie obiektowe w C, prawdopodobnie to zrozumie.

+0

Myślę, że twoja analogia do używania zasad OOP w Programy C są dobre. Szkoda, że ​​Scala zdecydowała się na swobodne, zmienne stany. Coś bardziej zbliżonego do referencji clojure byłoby bardziej odpowiednie dla Scali - ale mogło podnieść poprzeczkę do przeciętnego programisty Java. – dsmith

1

Aby dodać do powyższych punktów, fakt, że w modelu aktor Erlang jest jedynym sposobem, który można zaprogramować, sprawia, że ​​kod jest skalowalny od samego początku. Procesy Erlang są lekkie i możesz odrodzić 10-100K na jednym komputerze (nie sądzę, że możesz to zrobić z pythonem), to zmienia sposób, w jaki podchodzisz do problemów. Na przykład w naszym produkcie analizujemy dzienniki serwera WWW za pomocą Erlanga i spawnujemy proces Erlanga, aby obsłużyć każdą linię. W ten sposób, jeśli jedna linia dziennika jest uszkodzona, lub proces, który ją obsługuje, nic nie dzieje się z innymi. Kolejna różnica polega na tym, że kiedy zaczynasz używać OTP, otrzymujesz kontrolę nad procesami i możesz połączyć procesy tak, aby zakończyć wszystkie pozostałe. Poza tym, Erlang ma inną fajną funkcję (która może być znaleziona w innych językach przez biblioteki, ale znowu tutaj jest wypiekana), podobnie jak dopasowywanie wzorców i uruchamianie na gorąco.

+0

Fakt, że implementacja aktora jest zbudowana na wyjątkowo lekkich procesach i że można szybko odradzić setki tysięcy tych jednostek aktorów w jednym procesie systemu operacyjnego, czyni Erlang unikalnym. Inne implementacje wykorzystujące ciężkie procesy lub wątki systemu operacyjnego są ograniczone. – dsmith

+0

Łącząc te dwie odpowiedzi, otrzymuję teraz wyraźniejszy obraz. Łupanie procesu dla każdej linii dziennika brzmi szalenie, ale wydaje się to bardzo dobrą ilustracją ogromnej zmiany w zbliżaniu się problemów. Na pewno nie coś, co bym nawet spróbował w pytonie. I zgadzam się, że bycie * zmuszonym * przez język do pracy tylko w ten sposób może być korzystne. Dzięki temu, że wszystko jest bardziej przejrzyste! – gingerlime