私は最近、「軽量」/Go のような「ユーザー モード」スレッドを JVM に提供するQuasarについて読みました (Akka のような Erlang にインスパイアされた Actor システムもありますが、それは主な問題ではありません)。
例えば:
package jmodern;
import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.strands.Strand;
import co.paralleluniverse.strands.channels.Channel;
import co.paralleluniverse.strands.channels.Channels;
public class Main {
public static void main(String[] args) throws Exception {
final Channel<Integer> ch = Channels.newChannel(0);
new Fiber<Void>(() -> {
for (int i = 0; i < 10; i++) {
Strand.sleep(100);
ch.send(i);
}
ch.close();
}).start();
new Fiber<Void>(() -> {
Integer x;
while((x = ch.receive()) != null)
System.out.println("--> " + x);
}).start().join(); // join waits for this fiber to finish
}
}
上記のコードがJVM /カーネルスレッドを生成しないことを理解する限り、すべてはユーザーモードスレッドで行われ(または彼らが主張する)、安価であるはずです(私が正しく理解していればGoコルーチンのように)
私の質問はこれです-私が理解している限り、AkkaではすべてがまだJVMスレッドに基づいており、ほとんどの場合ネイティブOSカーネルスレッド(POSIXシステムのpthreadsなど)にマップされています。ユーザー モード スレッドがない / コルーチンのように動作する / Akka の軽量スレッド、正しく理解できましたか?
もしそうなら、それが設計上の選択かどうか知っていますか? それとも将来、Akka に go のような軽量スレッドを実装する計画はありますか?
私の理解では、100 万のアクターがあり、そのほとんどがブロックしている場合、Akka ははるかに少ない物理スレッドで処理できますが、それらのほとんどが非ブロックであり、システムからの応答性が必要な場合 (例: 100 万の小規模なサービス)いくつかのデータをストリーミングするための要求) の場合、ユーザー モードのスレッド化の実装の利点を確認できます。多くのクライアントがありますが、応答性は依然として重要です)
私の理解は多かれ少なかれ正しいですか?私が間違っている場合は修正してください。
*ユーザーモード スレッドと go/co-routine および軽量スレッドを完全に混同している可能性があります。上記の質問は、それらがすべて同じものであるという私の不十分な理解に依存しています。