【问题标题】:Scala 2.8Beta1 ActorScala 2.8Beta1 演员
【发布时间】:2011-01-20 05:53:49
【问题描述】:

调用!!即使在调用者收到回复后(即:future 已准备好),从一个 actor 到另一个 worker actor 的方法似乎也保持通道打开。

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

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

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

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

如何阻止这种情况?原始呼叫者是否自动“链接”到每个创建的回复频道!打电话?

【问题讨论】:

    标签: scala scala-2.8 actor


    【解决方案1】:

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

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

    【讨论】:

    • 看起来当未来被创建时,它被链接到将提供价值的参与者。设置值后,我认为它需要取消链接。这将阻止所有这些消息。此外,链接列表中的累积本质上是内存泄漏。
    • Scala 门票由 Engbrecht 先生制作lampsvn.epfl.ch/trac/scala/ticket/3102
    • @scaling_out Philipp 现在已经关闭了勾选。它应该在下一个 Scala 主干每晚或下一个 Scala 测试版上可用。
    • 谢谢,朋友!这是黄金。
    猜你喜欢
    • 2011-01-30
    • 2010-10-07
    • 2014-06-29
    • 2019-04-23
    • 2011-02-20
    • 2023-03-30
    • 2010-10-03
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多