4

呼唤!!即使在调用者收到回复后(即:未来已准备好),从一个演员到另一名工作演员的方法似乎也保持通道打开。

例如,使用 !! 将 11 条不同的消息从一个 actor 发送到另一个 worker actor 将导致 11 条类似于下面的消息显示在原始调用者的邮箱中,每个具有不同的 Channel@xxxx 值。

!(scala.actors.Channel@11b456f,Exit(com.test.app.actor.QueryActor@4f7bc2,'normal))

这些消息是否在等待工作人员的回复,因为原始调用者是在它自己调用 exit() 时发送退出消息,或者它们是在另一端生成的,并且由于某种原因有上面显示的打印表单?至此,worker actor 已经退出,所以 !! 的原始调用者 绝对不会收到任何回复。

这种行为是不可取的,因为原始调用参与者的邮箱充满了这些退出消息(每次使用 !! 时创建的每个通道都有一个)。

这怎么能阻止?原始呼叫者是否自动“链接”到每个创建的回复频道!称呼?

4

1 回答 1

5

之所以将这些 Exit 消息发送给原始调用者,是因为调用者将其用于接收未来结果的临时通道链接到被调用者。特别是,如果通道接收到退出信号,则会在该通道上发送退出消息,这会导致类似于您描述的消息被发送给实际调用者(您可以将通道视为消息上的标签)。这样做是为了允许(重新)在调用者内部抛出异常,如果被调用者在发送未来消息之前终止(在访问未来时抛出异常)。

当前实现的问题是,即使未来已经解决,调用者也会收到退出消息。这显然是一个应该在 Scala Trac 上提交的错误。一个可能的解决方法是仅在未来尚未解决时才发送退出消息。在这种情况下,只要第一次使用 apply 或 isSet 访问未来,就会删除 Exit 消息。

于 2010-02-24T12:58:47.653 回答