12

グローバルスレッドプールを使用する既存のjava/scalaアプリケーションがあります。プロジェクトでアクターの使用を開始したいのですが、アプリ内のすべてが同じプールを使用したいと思います。

アクターが使用するスレッドの最大数を設定できることはわかっていますが、スレッドプールを共有することをお勧めします。これは必要/合理的であり、アクターのスレッドプールを指定することは可能ですか?

それが不可能/推奨されていない場合、すでにスレッドを使用しているアプリにアクターを統合する際の経験則はありますか?

ありがとう。

4

3 に答える 3

7

次のようなことができると思います:

trait MyActor extends Actor {
  val pool = ... // git yer thread pool here
  override def scheduler = new SchedulerAdapter {
    def execute(block: => Unit) =
      pool.execute(new Runnable {
        def run() { block }
      })
  }
} 
于 2009-10-20T23:41:27.447 に答える
6

Scala 2.8.1 の場合:

scala -Dactors.corePoolSize=20
于 2011-01-19T17:41:38.003 に答える
2

しかし、アクター サブシステムが使用するスレッド プールを再利用するのは非常に簡単です。まず、サイズを制御できます。

-Dactors.maxPoolSize=8

そして、その上で作業を呼び出すことができます:

actors.Scheduler.execute( f ); //f is => Unit

欠けている唯一のものは、仕事をスケジュールする機能です。このために、シングル スレッドであり、アクター スレッド プールで作業を実行する別のスレッドScheduledExecutorServiceを使用します。

object MyScheduler {
  private val scheduler = Executors.newSingleThreadedScheduledExecutorService

  def schedule(f: => Unit, delay: (Long, TimeUnit)) : ScheduledFuture[_] = {
      scheduler.schedule(new ScheduledRun(f), delay._1, delay._2)
  }

  private class ScheduledRun(f: => Unit) extends Runnable {
    def run = actors.Scheduler.execute(f)
  }

}

次に、これを使用して何でもスケジュールできます。

MyScheduler.schedule(f, (60, SECONDS))
于 2009-10-21T06:26:30.717 に答える