Jak działają aktorzy w porównaniu z wątkami?

Czy jest jakieś dobre i krótkie wyjaśnienie działania aktorów w porównaniu z wątkami?

Czy wątek nie może być postrzegany jako aktor i wysyłać wiadomości do innych wątków? Widzę pewną różnicę, ale nie jest to dla mnie jasne. Czy Mogę używać aktorów w dowolnym języku, używając wątków w inny sposób?

Author: Jonas, 2010-08-27

2 answers

Model aktora operuje na przekazywaniu wiadomości. Poszczególne procesy (aktorzy) mogą wysyłać wiadomości asynchronicznie do siebie. To, co odróżnia to od tego, co zwykle myślimy o modelu gwintowania, to fakt, że nie ma (przynajmniej teoretycznie) wspólnego stanu. A jeśli ktoś wierzy (chyba słusznie), że wspólne państwo jest źródłem wszelkiego zła, to model aktora staje się bardzo atrakcyjny.

Nie powinniśmy się jednak ekscytować. Model aktora nie (wbrew do niektórych zarzutów) uniemożliwiają Model aktora również nie uniemożliwia konkurowania o zasoby między różnymi procesami - na przykład kolejkami wiadomości. Model jest tylko" bez blokady " powyżej pewnego poziomu. Na niższym poziomie, do koordynowania kolejek wiadomości, blokowanie jest nadal wymagane.

Czy wątek nie może być postrzegany jako aktor i wysyłać wiadomości do innych wątków?

Cóż, tak i nie. Nie, jeśli używasz tylko podejścia umieszczanie muteksów w miejscach pamięci współdzielonej. Następnie wątki dzielą ten stan-obaj mają dostęp do tej pamięci, mogą ją odczytać, zapisać ponownie itd. Ale można zbudować model aktora na modelu wątku, a rzeczywiście wszystkie implementacje aktora mają wątki pod spodem. Zhakowałem coś takiego (bardzo źle) dając każdemu wątkowi kolejkę strzeżoną przez mutex - tak dla Zabawy. Aby dowiedzieć się, w jaki sposób impedancja wątku aktora jest zarządzana, zobacz moje pytanie z roku ago .

Czy Mogę używać modelu Actor w dowolnym języku, używając wątków w inny sposób?

Tak, ale to wymaga trochę więcej pracy. Twój ulubiony język może mieć bibliotekę przekazującą wiadomości, więc to będzie pierwsza rzecz do zbadania. Należy również zbadać wykorzystanie niezmiennych struktur danych. Zauważ, że jeśli struktura danych jest niezmienna, to zasadniczo masz do czynienia z problemem "shared-state" - wiele wątków może zawierać odniesienia do niezmiennej danych bez niczego złego. Nie bez powodu języki aktorskie bywają również językami funkcyjnymi (erlang, scala).

Możesz również rzucić okiem na Software Transactional Memory, który jest innym, ale również atrakcyjnym modelem. Clojure to mój ulubiony przykład.

 66
Author: Rob Lachlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:41

Nie powiedziałbym, że aktorzy zawsze przekazują wiadomości asynchronicznie-to byłoby zbyt wolne. Przykład: projekt JActor używa komunikatów dwukierunkowych (request/response), aby lepiej modelować wywołanie metody. I większość wniosków są obsługiwane synchronicznie.

JActor (Biblioteka Javy) również nie używa blokad. Tylko niektóre atomowe i współbieżne struktury danych, z kilkoma semaforami. / Align = "left" / 8 miliardów wiadomości na drugi.

Https://github.com/laforge49/JActor

 2
Author: Bill la Forge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 10:09:06