Współbieżne programowanie Erlang i Go, obiektywne różnice między CSP a aktorami?

19

Patrzyłem na równoczesne programowanie w językach programowania Erlang i Go. Zgodnie z moimi ustaleniami są one używane odpowiednio jako model aktora i CSP.

Ale nadal jestem mylony z obiektywnymi różnicami między CSP a aktorami? czy to tylko teoretycznie inne, ale ta sama koncepcja?

nish1013
źródło
Nie są takie same, ponieważ Go zapewnia inny zestaw prymitywów niż Erlang. Dodatkowo Go jest znacznie niższy poziom niż Erlang i C-podobny.
Daniel Gratzer
Pytania na temat tego, jaki język, technologię lub projekt należy podjąć w następnej kolejności, są dla programistów nie na temat, ponieważ mogą one jedynie uzyskać subiektywne opinie. Pytanie jest zbyt wiele indywidualnych czynników, aby stworzyć odpowiedzi, które będą miały trwałą wartość. Zalecane lektury: Gorilla vs Shark
komar
3
@gnat Nie zgadzam się, chodzi o obiektywne różnice między CSP a aktorami. To całkowicie rozsądne pytanie
Daniel Gratzer
2
Pytanie nie dotyczy tego, co dobre czy złe, ale inne, które należy ustalić, dlatego pytanie to jest konkretne i nie jest przyczyną subiektywnej debaty.
nish1013
1
Odpowiedź na to pytanie jest bardzo ładna na stosie teorii CS Stosunek: Jaka jest różnica między modelem współbieżności aktora a komunikowaniem procesów sekwencyjnych
Jörg W Mittag

Odpowiedzi:

21

W praktyce różnica jest niewielka: obie reprezentują odrębne jednostki wykonawcze, których podstawowym interfejsem ze światem zewnętrznym są wiadomości.

Różnice dotyczą szczegółów implementacji języków. Oto kilka takich szczegółów:

  • Kanały w Go są wpisywane; jeśli chcesz wysyłać wiadomości z różnymi danymi, potrzebujesz osobnych kanałów. Dzięki Erlangowi receivewszystko jest wysyłane do procesu i musi być dopasowane do wzorca (w Go użyłbyś znaku selectz wieloma przypadkami, więc kod wyglądałby bardzo podobnie, tylko z różnymi kanałami).
  • Każdy może czytać lub pisać kanał Go. W Erlang każdy może wysłać do procesu, ale tylko ten proces otrzyma. Staje się to ważne, jeśli chcesz podzielić zadanie między wielu pracowników: w Erlang musisz utworzyć proces dystrybucji, podczas gdy Go może po prostu udostępnić kanał.
  • Erlang zapewnia (przeważnie) przejrzystą ścieżkę do dystrybucji procesów na wielu hostach / maszynach wirtualnych. Goroutine są ograniczone do jednego procesu (chociaż istnieją biblioteki do dystrybucji).
  • Obsługa błędów jest zupełnie inna. Erlang traktuje każdy proces jako niezależny: błąd w jednym procesie (powiedzmy „dziel przez 0”) nie wpłynie na żadne inne procesy, chyba że je wyraźnie połączysz (chociaż coś oczekującego na wiadomość z martwego procesu się zawiesi). Wszystkie gorutynki działają w tej samej przestrzeni procesu; dzielenie przez 0 spowoduje usunięcie całego programu.
  • W Erlang dane są niezmienne. Oznacza to, że wszelka komunikacja między procesem a światem zewnętrznym odbywa się za pośrednictwem komunikatów. Go pozwala ci dzielić stan między goroutynami (chociaż nie powinieneś).

Myślę, że ten ostatni punkt jest najważniejszy. Podczas gdy oba używają wiadomości jako głównego środka komunikacji, Erlang daje znacznie silniejsze gwarancje dotyczące tego, jak i kiedy stan może się zmienić.

kdgregory
źródło