在Actor中调用阻塞Actor

时间:2009-08-10 12:15:49

标签: scala concurrency blocking actor

鉴于我从内部调用Actor,这会阻止调用Actor还是仍在处理其他请求?

class worker extends Actor()
{
  def act() = {
    loop {
      react {
        msg =>
          var foo = another_actor !? 'bar' //Block here?
          println(foo)
      }
    }
}

2 个答案:

答案 0 :(得分:3)

!? 始终阻止调用线程。如果它在actor的反应块中间调用,那么调用actor也会被阻塞。

演员的主要思想是单一执行线程。演员不会继续下一个消息,直到当前消息完成处理。这样,只要消息是不可移植的,开发人员就不必担心并发性。

答案 1 :(得分:2)

请参阅this question关于演员不能同时处理消息的事实(即每个演员按顺序处理其收件箱)。

我当然不认为从Scala中编程的解释中可以看出这一点。你可以通过创建一个即时演员来实现你想要的目标:

loop {
   react {
      case Command(args) =>
         val f = other !! Request(args) //create a Future
         //now create inline actor
         val _this = self
         actor { //this creates an on-the-fly actor
           _this ! Result(args, f.get) //f.get is a blocking call              
         }
      case Result(args, result) =>
         //now process this 
   }
}

当然, on-the-fly actor会阻止,但它确实让你的原始actor能够处理新消息。如果所有当前池化工作线程都忙,则actors子系统将创建最多actors.maxPoolSize的新线程(默认为256)。