2

Akka でメッセージを調整する例を教えてください。

これが私のコードです

object Program {
  def main(args: Array[String]) {
    val system = ActorSystem()
    val actor: ActorRef = system.actorOf(Props[HelloActor].withDispatcher("akka.actor.my-thread-pool-dispatcher"))

    val zzz : Function0[Unit] = () => {
      println(System.currentTimeMillis())
      Thread.sleep(5000)
    }

    var i: Int = 0
    while (i < 100) {
      actor ! zzz
      i += 1
    }

    println("DONE")

//    system.shutdown()
  }
}

class HelloActor extends Actor {
  def receive = {
    case func : Function0[Unit] => func()
  }
}

ここに私の設定があります

akka {
  actor {
    my-thread-pool-dispatcher {
      type = Dispatcher
      executor = "thread-pool-executor"
      thread-pool-executor {
        task-queue-type = "array"
        task-queue-size = 4
      }
    }
  }
}

しかし、実行すると、4つのメッセージが同時に処理されると予想されるシングルスレッドのように見えます。

ここで何が欠けていますか?

4

2 に答える 2

7

質問のタイトルと内容の関連性がわかりません。

Akka でのメッセージのスロットリングに関する記事は次のとおりです。

http://letitcrash.com/post/28901663062/throttling-messages-in-akka-2

しかし、アクターが一度に 1 つのメッセージしか処理していないことに戸惑っているようです。しかし、それが Akka アクターの仕組みです。メッセージの単一のメールボックスがあり、連続ループで一度に 1 つのメッセージのみを処理します。

複数のタスクを同じ作業処理ユニットで同時に処理したい場合は、ルーターを検討することをお勧めします。

http://doc.akka.io/docs/akka/2.1.2/scala/routing.html

于 2013-04-15T05:18:55.427 に答える
1

Typesafe は最近 akka リアクティブ ストリームを発表しました。スロットリングは、背圧機能を使用して実現できます。

http://java.dzone.com/articles/reactive-queue-akka-reactive

于 2014-08-05T06:16:35.143 に答える