当前位置: 首页 > 知识库问答 >
问题:

如何在Akka中使用setReceiveTimeout同步杀死子参与者

魏鸿
2023-03-14

背景:我正在使用C#,但我认为这个问题也适用于Java和Scala。我有一个大师级演员,负责传递所有的“工作信息”。这些作业可以同时执行,只要它们不共享“并发id”。为了解决这个问题,我为每个“并发id”生成了一个子角色。然后我用setReceiveTimeout在孩子们空闲时清理他们。

我不明白的是,在没有比赛条件的情况下,我如何做到这一点。这里有两种方法不起作用:1)从字典中删除子项,并告诉子项终止。这不起作用,因为在触发超时时间到父级开始处理消息之前,消息可能已添加到子级队列中,从而导致消息丢失。2) 将孩子从字典中删除,并发送毒药。这不起作用,因为子对象可能会继续处理新工作。如果更多的工作到达父级,父级将创建一个新的子级,这意味着两个具有相同并发id的东西同时运行。3) 从字典中删除孩子,并用信息“询问”孩子。如果消息返回

家长是否有办法询问孩子队列中是否有任何消息?(这不是竞争条件,因为给子级的所有消息都来自父级)

家长是否可以检查孩子的队列是否为空,孩子是否没有处理任何事情?

我是否应该添加新消息并“询问”孩子是否已完成?(这将是安全的,因为我知道父级是唯一发送消息的人,但是如果子级正在处理消息,或者如果调度程序的池中没有可用线程,则这可能会造成阻塞。

我的问题类似于这个问题,但我添加了"并发id"的额外约束,并不担心"僵尸演员"目前正在关闭,只要僵尸没有工作,不会得到更多的工作:获取或创建子Akka演员并确保活性

共有1个答案

邬承悦
2023-03-14

Akka确保演员邮箱是私有的。一个演员的邮箱不关另一个演员的事。父母检查孩子的邮箱是否是空的是错误的。

你为什么认为ask会阻止你?

一个选择:不要杀死孩子。如果您有一组固定的并发ID,您可以一次又一次地使用,只需让所有参与者保持活动状态即可。参与者不会消耗太多资源。

另一个选择:

When the parent wants to kill the child:
send a PoisonPill to the child and remove him from the Dictionary.

When the parent receives a "job message" with concurrencyID:
if (Dictionary.contains(concurrencyID) {
    send message to child
} else {
    if (parent has child with name concurrencyID) {
        delay message - for example with scheduler // child is terminating
    } else {
        create a child with name concurrencyID
        send message to child
    }
}
 类似资料:
  • 问题内容: 使用shelljs创建一个子进程 杀死父进程后,子进程仍在运行.. 问题答案: 如果您可以使用node的内置,则可以向子进程发送信号: 这样做的好处是,主进程应该一直徘徊,直到所有子进程都终止。

  • 问题内容: 我在Python中使用子进程包运行一个子进程,以后需要杀死它。但是,子流程包的文档指出,terminate()函数仅从2.6起可用。 我们正在运行带有2.5的Linux,并且出于向后兼容的原因,我无法升级到2.6,替代品是什么?我猜这些功能是某些事情的便捷方法。 问题答案: 您在进程pid上调用os.kill。 您还可以,因为您使用的是Linux。Windows用户很不走运。

  • 我读过以下文档https://doc.akka.io/docs/akka/current/general/message-delivery-reliability.html#deal-letters,其中写道: 参与者可以订阅事件流上的类Akka.actor.deadletter,请参见event stream以了解如何做到这一点。 但是在Akka Typed中,中没有名为的方法。

  • 问题内容: 我从python脚本生成了5个不同的进程,如下所示: 我的问题是,当父进程(主脚本)以某种方式被杀死时,子进程继续运行。 当父进程被杀死时,有没有办法杀死这样生成的子进程? 编辑:我正在尝试: 但这似乎不起作用 问题答案: 我自己也遇到了同样的问题,我有以下解决方案: 打电话之前,您可以设置。然后如此处所述python.org multiprocessing 进程退出时,它将尝试终止其

  • 问题内容: 如何java.lang.Thread用Java 杀死A ? 问题答案: 有关他们为何不赞成使用Sun的内容,请参见此主题。它详细介绍了为什么这是一种不好的方法,以及通常应该采取什么措施才能安全地停止线程。 他们建议的方式是使用共享变量作为标志,要求后台线程停止。然后可以由另一个请求线程终止的对象来设置此变量。

  • 问题内容: 问题答案: 调用stop的替代方法是使用中断向线程发出信号,告知你希望它完成其工作。(这假设你要停止的线程行为良好,如果它在抛出异常后立即通过吃掉它们而忽略了InterruptedException,并且不检查中断状态,那么你将返回使用stop()。) 下面是一些代码,我写的一个答案,一个线程的问题在这里,它的线程中断,将如何工作的例子: 要注意的一些事情: 中断原因并立即抛出,否则你