8

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

如何检查所有 N 名员工是否都已回复主管?是否可以通过任何类型的事件处理来实现这一点 - 即告诉主管“好的,每个人都已回复”,而不是让主管在某种 ETS 中每秒检查“所有 N 个进程都已回复”状态子注册表?

4

2 回答 2

8

如果您谈论的是 OTP supervisor,则不,您不能从中向工作人员发送消息。主管是一种非常有限的行为,其目的是启动监视重新启动停止进程。没有其他的。

因此,要解决您的特定问题,您必须有一个负责向所有工作人员发送消息的进程。此过程还可以保留其状态下所有工人的列表,“勾选”(或从列表中删除)已响应的工人。您可以通过 PID 列表来实现这一点,并接收来自进程的响应(或者通过监视进程erlang:monitor/2是否在它们完成时退出)并查看剩下的人。

于 2011-09-20T08:52:35.200 回答
3

另一种可能(或不能)适用于您的案例的替代方法是使用gen_event行为。

免责声明

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

免责声明结束

所以...

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

事件是消息。

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

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

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

sync_notify 是同步的,因为它会在所有事件处理程序处理完事件后返回 ok。

有关 *gen_event* 的更多信息,请查看此处此处

于 2011-09-22T13:15:56.213 回答