由于我从内部调用Actor
反应会阻止调用Actor
还是处理其他请求?调用演员内部的阻挡演员
class worker extends Actor()
{
def act() = {
loop {
react {
msg =>
var foo = another_actor !? 'bar' //Block here?
println(foo)
}
}
}
由于我从内部调用Actor
反应会阻止调用Actor
还是处理其他请求?调用演员内部的阻挡演员
class worker extends Actor()
{
def act() = {
loop {
react {
msg =>
var foo = another_actor !? 'bar' //Block here?
println(foo)
}
}
}
请参阅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
)的新线程。
!?
一直阻塞调用线程。如果它在演员反应区块中间调用,则主叫演员也会被阻止。
演员的主要想法是单线程执行。演员将不会继续下一条消息,直到当前的消息完成处理。这样,只要消息是不可变的,开发人员就不必担心并发性。