Vorrei innanzitutto dire che ho un bel po 'di esperienza Java, ma solo di recente mi sono interessato ai linguaggi funzionali. Recentemente ho iniziato a guardare Scala, che sembra un linguaggio molto carino.Gli attori Scala: ricevere vs reagire
Tuttavia, ho letto su Scala's Actor framework in Programming in Scala e c'è una cosa che non capisco. Nel capitolo 30.4 si dice che l'utilizzo di react
invece di receive
rende possibile riutilizzare i thread, il che è positivo per le prestazioni, poiché i thread sono costosi nella JVM.
Ciò significa che, finché mi ricordo di chiamare react
anziché receive
, posso avviare il numero di attori che mi piace? Prima di scoprire Scala, ho suonato con Erlang e l'autore di Programming Erlang si vanta di generare oltre 200.000 processi senza perdere tempo. Odio farlo con i thread Java. Che tipo di limiti sto guardando in Scala rispetto a Erlang (e Java)?
Inoltre, come funziona il riutilizzo di questo thread in Scala? Supponiamo, per semplicità, di avere solo un thread. Tutti gli attori che avvierò verranno eseguiti sequenzialmente in questo thread o si verificherà una sorta di commutazione delle attività? Ad esempio, se avvii due attori con messaggi di ping-pong l'un l'altro, rischierò un deadlock se sono avviati nello stesso thread?
Secondo Programmazione in Scala, scrivendo soggetti a utilizzare react
è più difficile che con receive
. Sembra plausibile, dal momento che react
non restituisce. Tuttavia, il libro continua a mostrare come è possibile inserire uno react
all'interno di un ciclo utilizzando Actor.loop
. Di conseguenza, si ottiene
loop {
react {
...
}
}
che, a me, sembra abbastanza simile a
while (true) {
receive {
...
}
}
che viene utilizzato in precedenza nel libro. Tuttavia, il libro dice che "in pratica, i programmi avranno bisogno di almeno alcuni receive
". Quindi cosa mi manca qui? Cosa può receive
fare che react
non può, oltre a restituire? E perché me ne importa?
Infine, venendo al centro di ciò che non capisco: il libro continua a menzionare come l'utilizzo di react
consente di scartare lo stack di chiamate per riutilizzare il thread. Come funziona? Perché è necessario scartare lo stack delle chiamate? E perché lo stack di chiamate può essere scartato quando una funzione termina lanciando un'eccezione (react
), ma non quando termina restituendo (receive
)?
Ho l'impressione che la programmazione in Scala abbia risolto alcuni dei problemi chiave qui, il che è un peccato, perché altrimenti è un libro davvero eccellente.
vedere anche http://stackoverflow.com/questions/1526845/when-are-threads-created-for-scala-actors –