2009-08-10 73 views
1

由于我从内部调用Actor反应会阻止调用Actor还是处理其他请求?调用演员内部的阻挡演员

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

回答

2

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

我当然不认为这是非常明确的从编程在斯卡拉解释。你可以(在某种程度上)实现你想要通过创建上的即时演员:

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 
    } 
} 

当然,上即时演员将阻止,但它离开你原来的演员能够处理新消息。如果所有当前共用工作线程都忙,则参与者子系统将创建高达actors.maxPoolSize(默认值为256)的新线程。

3

!?一直阻塞调用线程。如果它在演员反应区块中间调用,则主叫演员也会被阻止。

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