9

私は最近、「軽量」/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 および軽量スレッドを完全に混同している可能性があります。上記の質問は、それらがすべて同じものであるという私の不十分な理解に依存しています。

4

2 に答える 2

3

Akka アクターは本質的に非同期であるため、多くのアクターを使用できますが、Erlang のアクターに非常に近い Quasar アクター (はい、Quasar もアクターの実装を提供しています) は同期またはブロッキングですが、Java ではなくファイバーを使用します (つまり、現在の OS) スレッドでは、非同期と同じパフォーマンスで多くのスレッドを使用できますが、通常のスレッドを使用して呼び出しをブロックする場合と同じくらい簡単なプログラミング スタイルを使用できます。

I/O は統合によって処理されます。Quasar には、非同期 API と同期 API の両方をファイバー ブロッキングに変換するフレームワークが含まれており、Comsatには、そのような統合が既に多数含まれています (Java NIO を含むものは、Quasar に直接含まれています)。

別の質問への私の返信には、さらに詳しい情報が含まれています。

于 2015-10-25T10:38:54.207 に答える