我有一个拥有N个工作流程的主管。像往常一样,主管可以向工作进程发送消息,并且有一个handle_cast
将工作人员的回复发送给主管。
我如何确定所有N名工人都已回复主管?是否可以通过任何类型的事件处理来实现这一点 - 即告诉主管“好的,每个人都回复了”并且不让主管在某种ETS中每秒检查“所有N个进程已经回复”状态子登记表?
答案 0 :(得分:8)
如果您正在谈论OTP supervisor
,那么您无法向其发送消息。主管是一种非常有限的行为,目的是启动,监控,重新启动和停止进程。没别了。
因此,要解决您的特定问题,您必须拥有一个负责向所有员工发送消息的流程。此过程还可以保留所有处于其状态的工人的列表,“勾选”(或从列表中删除)已响应的工作人员。您可以通过PID列表实现此目的,并接收来自流程的响应(或者如果流程完成后通过erlang:monitor/2
监控流程)并查看谁离开了。
答案 1 :(得分:3)
替代方案 - 可能(或不能)适用于您的案例是使用gen_event行为。
<强>声明强>
我说“可以”因为它取决于你的“工人”在你的具体情况下做了什么。如果您对他们的回复内容感兴趣,您可能不愿意使用这种方法,但是如果您只对所有工作人员完成他们的任务感兴趣 - 例如工作进程执行一些繁重的计算并将它们的部分结果存储在数据库中,因此您已准备好组合部分 - gen_event可能是要去的路径。
免责声明
因此...
在OTP中,事件管理器是可以向其发送事件的命名对象。
事件就是消息。
在事件管理器中,安装了零个,一个或多个事件处理程序。当事件管理器收到有关事件的通知时,事件将由所有已安装的事件处理程序处理。
所以,基本上,你没有一个主管和几个工人,而是有一个事件管理器和几个事件处理程序。
然后您可以使用gen_event:sync_notify/2功能:
sync_notify是同步的,因为它会在之后返回ok 事件已由所有事件处理程序处理。