Erlang主管:如何检查所有工作人员是否已回复

我有一个有N个工作流程的主管。 像往常一样,主管可以向工作进程发送消息,并且有一个handle_cast将工作人员的回复发送给主管。

我如何检查确切地说,所有N员工都已回复给主管? 是否可以通过任何形式的事件处理来实现 - 即告诉主管“好的,每个人都已回复”,并且不要让主管每秒在某种ETS中检查“全部N个进程已回复”状态儿童注册表表?


如果你正在谈论一位OTP supervisor ,不,你不能从它发送消息给工作人员。 主管的行为非常有限,其目的是启动,监控,重新启动和停止流程。 没有其他的。

因此,要解决您的特定问题,您必须有一个负责向所有员工发送消息的流程。 这个过程还可以列出所有工人的状态,“打勾”(或从列表中删除)已经回复的工人。 您可以使用PID列表来实现此目的,并接收来自进程的响应(或者通过在erlang:monitor/2下监视进程(如果它们在完成时退出)并查看谁已离开。


另一种方法 - 可以(或不能)适用于你的案例是使用gen_event行为。

免责声明

我说“可以”,因为它取决于你的“工人”在你的具体情况下做什么。 如果你对他们的回复内容感兴趣,你可能不希望使用这种方法,但是如果你对所有工作人员完成他们的任务感兴趣,例如工作进程做了一些繁重的计算并将它们的部分结果存储在数据库中,以便您准备好结合这些部分 - gen_event可能是要去的路线。

免责声明结束

所以...

在OTP中,事件管理器是可以发送事件的命名对象。

事件是消息。

在事件管理器中,安装了零个,一个或多个事件处理程序。 当事件管理器收到有关事件的通知时,事件将由所有安装的事件处理程序处理。

所以,基本上,不是有一个主管和几个工人,你有一个事件管理器和几个事件处理程序。

然后你可以使用gen_event:sync_notify / 2函数:

sync_notify是同步的,因为在事件被所有事件处理程序处理后它将返回OK。

有关* gen_event *的更多信息,请看这里和那里。

链接地址: http://www.djcxy.com/p/38229.html

上一篇: Erlang supervisor: how to check if all the workers have replied

下一篇: Automatically restarting Erlang applications