依赖reply
Scala Actor 对我来说似乎非常容易出错。这真的是在演员之间进行对话的惯用 Scala 方式吗?有没有替代方案,或更安全地使用reply
我所缺少的?
(关于我:我熟悉 Java 中的同步,但我之前从未设计过基于 actor 的系统,也没有完全理解该范式。)
示例错误
作为一个简单的演示,让我们看看这个愚蠢的整数解析 Actor:
import actors._, Actor._
val a = actor {
loop {
react {
case s: String => reply(s.toInt)
}
}
}
我们可以打算将其用作
scala> a !? "42"
res0: Any = 42
但是如果演员没有回复(在这种情况下,因为粗心的程序员没有想到要抓住NumberFormatException
演员),我们将永远等待:
scala> a !? "f"
我们在呼叫现场也犯了一个错误。下一个示例也无限期阻塞,因为参与者不回复Int
消息:
scala> a !? 42
超时
如果预期的回复有一些已知的合理时间限制,您可以使用!? (msec: Long, msg: Any)
,但在我能想到的大多数情况下,情况并非如此。
保证回复
一种想法是设计该actor,使其必须回复每条消息:
import actors._, Actor._
val a = actor {
loop {
react {
case m => reply {
try {
m match {
case s: String => reply(s.toInt)
case _ => None
}
} catch {
case e => e
}
}
}
}
}
这样感觉好多了,虽然还是有点怕一不小心调用!?
了一个演员不再演戏了。