Aktorzy Scala: otrzymuj vs reaguj

Pozwólcie, że najpierw powiem, że mam sporo doświadczenia z Javą, ale dopiero niedawno zainteresowałem się językami funkcjonalnymi. Ostatnio zacząłem patrzeć na Scalę, która wygląda na bardzo miły język.

Czytałem jednak o ramach aktorskich Scali wProgramowanie w Scalii jest jedna rzecz, której nie rozumiem. W rozdziale 30.4 mówi się o użyciureact zamiastreceive umożliwia ponowne wykorzystanie wątków, co jest dobre dla wydajności, ponieważ wątki w JVM są drogie.

Czy to znaczy tak długo, jak długo pamiętamreact zamiastreceive, Mogę zacząć tylu aktorów, ile lubię? Przed odkryciem Scali grałem z Erlangiem i autoremProgramowanie Erlang chwali się spawnowaniem ponad 200 000 procesów bez przerywania potu. Nie chciałbym tego robić z wątkami Java. Jakie ograniczenia widzę w Scali w porównaniu z Erlang (i Java)?

W jaki sposób ten wątek ponownie działa w Scali? Dla uproszczenia załóżmy, że mam tylko jeden wątek. Czy wszyscy aktorzy, których zacznę, będą biegać sekwencyjnie w tym wątku, czy też nastąpi zmiana zadań? Na przykład, jeśli zacznę od dwóch aktorów, że wiadomości ping-ponga do siebie nawzajem, czy ryzykuję zakleszczenie, jeśli zaczną się w tym samym wątku?

WedługProgramowanie w Scali, pisanie aktorów do użyciareact jest trudniejszy niż zreceive. Brzmi to wiarygodnie, ponieważreact nie wraca. Jednak książka pokazuje, jak można umieścićreact wewnątrz pętli za pomocąActor.loop. W rezultacie dostajesz

loop {
    react {
        ...
    }
}

co dla mnie wydaje się bardzo podobne do

while (true) {
    receive {
        ...
    }
}

który jest używany wcześniej w książce. Mimo to książka mówi, że „w praktyce programy będą potrzebować co najmniej kilkureceive's. Więc czego mi tu brakuje? Co możereceive Zrób toreact nie może, oprócz powrotu? I dlaczego mnie to obchodzi?

Na koniec dochodzę do sedna tego, czego nie rozumiem: książka wspomina o tym, jak używaćreact umożliwia odrzucenie stosu wywołań w celu ponownego użycia wątku. Jak to działa? Dlaczego konieczne jest odrzucenie stosu połączeń? I dlaczego stos wywołań może zostać odrzucony, gdy funkcja kończy się przez zgłoszenie wyjątku (react), ale nie, gdy kończy się przez powrót (receive)?

Mam wrażenie, żeProgramowanie w Scali omawia tutaj niektóre kluczowe kwestie, co jest wstydem, ponieważ w przeciwnym razie jest to naprawdę znakomita książka.

questionAnswers(5)

yourAnswerToTheQuestion