最初に言っておきますが、私は Java の経験が豊富ですが、関数型言語に興味を持ち始めたのはつい最近のことです。最近、私は Scala に注目し始めました。これは非常に優れた言語のようです。
しかし、プログラミング in Scalaで Scala の Actor フレームワークについて読んでいて、理解できないことが 1 つあります。章 30.4react
では、代わりにreceive
使用するとスレッドの再利用が可能になると述べられています。これは、JVM ではスレッドが高価であるため、パフォーマンスに適しています。
react
これは、の代わりに呼び出すことを覚えている限り、receive
好きなだけアクタを開始できるということですか? Scala を発見する前は、私は Erlang をいじっていました。Erlang のプログラミングの著者は、200,000 を超えるプロセスを苦労せずに生成したことを自慢しています。Javaスレッドでそれを行うのは嫌いです。Erlang (および Java) と比較して、Scala ではどのような制限が見られますか?
また、このスレッドの再利用は Scala でどのように機能しますか? 簡単にするために、スレッドが 1 つしかないと仮定しましょう。私が開始したすべてのアクターは、このスレッドで順番に実行されますか? それとも何らかのタスク切り替えが行われますか? たとえば、互いにメッセージをピンポンする 2 つのアクターを開始した場合、それらが同じスレッドで開始された場合、デッドロックの危険がありますか?
Programming in Scalaによると、使用するアクターを記述することreact
は、 を使用する場合よりも困難ですreceive
。react
返されないので、これはもっともらしく聞こえます。ただし、この本は、 をreact
使用してループ内に配置する方法を示していますActor.loop
。その結果、あなたは得る
loop {
react {
...
}
}
これは、私にはかなり似ているようです
while (true) {
receive {
...
}
}
これは本書の前半で使用されています。それでも、この本には、「実際には、プログラムには少なくとも数個receive
の が必要になる」と書かれています。それで、私はここで何が欠けていますか?戻る以外にできること、できないreceive
ことは何ですか?react
そして、なぜ私は気にしますか?
最後に、私が理解していないことの核心に来ます.本は、どのように使用react
するとコールスタックを破棄してスレッドを再利用できるようになるかについて言及し続けています。それはどのように機能しますか?コールスタックを破棄する必要があるのはなぜですか? また、関数が例外をスローして終了する場合 ( react
) にコール スタックを破棄できるのに、( ) を返すことで関数が終了する場合に破棄できないのはなぜreceive
ですか?
Programming in Scalaは、ここでの重要な問題のいくつかをごまかしているように感じますが、それ以外は本当に優れた本なので、これは残念です。