1

私は Scala のアクターについて読んでいるので、次のようなものがあるとします:

object Worker extends Actor {
  def act() {
    while(true) {
      receive {
        case "exit" => {
          println("exiting...")
          sender ! Exit
        }
        case s:String if s.startsWith("scp") => {
          println("Starting scp")
          Thread.sleep(2000)
          sender ! Done(s)
        }
        case s:String => {
          println("Starting " + s)
          sender ! Done(s)
        }
      }
    }
  }
}

( http://www.naildrive5.com/scalatour/wiki_pages/ActorsAndConcurrency )

Java では、同等のパターンはどのようになりますか? Javaでこれを行うのははるかに面倒だと理解しています。

Scala のアクターにパフォーマンスへの影響はありますか? 確かに、私が収集したものから実装して理解する方がはるかに簡単ですが、トレードオフがあるかどうかに興味があります.

4

3 に答える 3

7

akkaフレームワークを見てください。これにより、Java の Actor Model の力が得られます。

于 2012-11-29T15:55:20.310 に答える
4

Scala のアクター (akka のアクターと混同しないでください) は事実上、入力キューを持つスレッドであり、同等のものは Java で簡単に実装できます。

 interface Port<T>{
   public void send(T msg);
 }
 class StringMessage {
   String value;
   Port sender;
 }
 class Worker extends Thread implements Port<StringMessage>{
     ConcurrentLinkedQueue<StringMessage > q=new ConcurrentLinkedQueue<StringMessage >();

     public send(StringMessage m) {
       q.put(m);
     }

     public void run() {
        while(true) {
          StringMessage msg=q.take();
          String s=msg.value;
          if (s.equals("exit") {
             println("exiting...");
             msg.sender.send(Exit);
             return;
          } else if (s.startsWith("scp") {
             println("Starting scp")
             Thread.sleep(2000)
             msg.sender.send(Exit);
          } else {
             println("Starting " + s)
             msg.sender.send(Done(s));
          }
       }
    }
  }

これは単なるスケッチです。実行可能にするには、通信スレッド間のコントラクトとプロトコルを開発する必要があります。または、Java 用の既存のアクター フレームワークを使用することもできます (多数あります)。賢明に選択するには、次の質問に答える必要があります。

  • アクターは、スレッド プール上で実行されるスレッドまたは軽量タスクに基づくべきですか? スレッドは大量のメモリを消費しますが、ブロック操作は可能です。最も広く知られている Akka フレームワークは軽量タスクを使用します。

  • 俳優モデルで十分ですか?従来のアクターは単一の入力ポートを持ち、より広範なデータフロー モデルではアクター ノードが複数の入力ポートを持つことができ、すべての入力ポートが空でない場合に発火が発生します。これにより、別の質問のように「ネストされたコールバック」を構築できます。Java データフロー フレームワークはまれです。私が知っている唯一のオープンソース ライブラリは、私のdf4jです。スレッドベースとタスクベースの両方のアクター ノードを許可し、単一の入力を持つサブクラス Actor を持ちます。

于 2012-11-29T16:42:16.507 に答える
4

他の誰かが言ったように、Akka はおそらく最良の候補です。これは Scala で書かれていますが、Java からも非常にアクセスしやすいように作られています。補足として、Akka の実装は将来的に現在の実装に取って代わります。

また、Scala アクターの実装は言語自体の機能ではなく、標準ライブラリにその実装が含まれているだけです。

パフォーマンスへの影響に関する限り、現在の Scala の実装はいずれにしてもそれほど良くないため、悪い例になります。ただし、Akka のドキュメントを十分に推奨することはできません: http://doc.akka.io/docs/akka/2.0.4/

于 2012-11-29T16:14:50.313 に答える