Scala参与者:如果react从不返回,为什么它需要在循环{}中,为什么';当(真的)工作的时候?

Scala参与者:如果react从不返回,为什么它需要在循环{}中,为什么';当(真的)工作的时候?,scala,actor,Scala,Actor,刚刚开始学习Scala演员。报告说: 通过使用react等待,可以避免线程阻塞操作 新消息(基于事件的receive挂件)。然而,有一个问题 (通常很小)付出的代价:react永不返回 请注意,在循环中使用react,而循环不起作用!然而, 由于循环是常见的,所以在表单中有特殊的库支持 一个循环函数。它可以这样使用: 我现在感到困惑——似乎有一个矛盾: a) 如果react从未返回,那么将其放入循环有什么意义 b) 既然loop重复执行一个块,那么它与while(true)有什么不同呢?whi

刚刚开始学习Scala演员。报告说:

通过使用
react
等待,可以避免线程阻塞操作 新消息(基于事件的
receive
挂件)。然而,有一个问题 (通常很小)付出的代价:
react
永不返回

请注意,在
循环中使用
react
,而
循环不起作用!然而,
由于循环是常见的,所以在表单中有特殊的库支持
一个
循环
函数。它可以这样使用:

我现在感到困惑——似乎有一个矛盾:

a) 如果
react
从未返回,那么将其放入循环有什么意义


b) 既然
loop
重复执行一个块,那么它与
while(true)
有什么不同呢?while
为什么不起作用,它以什么方式“不起作用”?

这两个函数,
loop
react
都不是纯粹的
loop
接受按名称参数调用和
react
PartialFunction,这两个函数都在原始参与者上设置变量。这是因为一个演员并不是一直都有一条线索。只有当它的messagebox中有消息时,它才会激活。这就是为什么
while(true)
将导致100%的cpu使用率和参与者不响应

我在以下(我的重点)中找到了回答我问题a)部分的解释:

其核心思想如下:一个在接收中等待的参与者 语句不是由阻塞线程表示的,而是由 捕获参与者的其余计算。关闭已执行 一旦消息发送到与其中一条消息匹配的参与者 接收中指定的模式。关闭的执行是 \“猪背”在发送器的线程上

如果接收关闭 终止时,控件将像过程一样返回给发送方 返回。如果接收闭包在第二次接收中阻塞,则控制 通过抛出展开的特殊异常返回给发送方 接收器的调用堆栈

计划实施的必要条件 工作是接受者永远不会正常地回到他们的封闭参与者那里。 换句话说,参与者中的任何代码都不能依赖于终止或终止 接收块的结果


因此,Scala网站解释中缺少的部分是,
react
不会正常返回,但仍然会终止(可能通过异常?),因此会重复调用?我不认为这是“缺少的部分”。这是一个实现细节,与开发人员无关。相关信息是while(true)不起作用。如果您对细节感兴趣,您可以查看源代码,我通常这样做是为了更好地理解事情。如果您只是按照配方进行操作,这可能无关紧要,但对我来说,这是解释中的一个主要绊脚石-某个东西是否返回不是实现细节(如果您试图循环/重复)-这绝对是最基本的!在提出问题之前,我快速查看了资料来源,但我会按照你的建议进行更深入的挖掘…我想知道我是否可以找到一种方法与你联系,了解一个可能适合你技能的开发/咨询项目。什么是联系的好方法?我的个人资料中有联系电子邮件-但我是f对不起,我现在正忙着呢。
loop {
  react {
    case A => ...
    case B => ...
  }
}