【发布时间】:2013-01-03 19:58:48
【问题描述】:
依赖于来自 Scala Actor 的 reply 对我来说似乎非常容易出错。这真的是在演员之间进行对话的惯用 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
}
}
}
}
}
这感觉好多了,虽然还是有点担心不小心调用!? 对不再演戏的演员。
【问题讨论】: