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