鉴于我从内部调用Actor
,这会阻止调用Actor
还是仍在处理其他请求?
class worker extends Actor()
{
def act() = {
loop {
react {
msg =>
var foo = another_actor !? 'bar' //Block here?
println(foo)
}
}
}
答案 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
)。