【发布时间】:2015-02-19 00:00:22
【问题描述】:
我想设计一个进程层次结构,其中有一个父进程 P,它充当看门人并将工作(来自其客户端进程的消息/事件)委托给它的子进程 C1、C2..Cn,它们与每个进程协作其他并可能将结果发送回 P。子进程不能与外部的任何进程通信,只能与 P 通信。
挑战在于,尽管 P 可能有来自其客户端的多条消息,但它应该只接受一条消息,将工作委托给 C1..Cn 并且只接受来自其客户端的下一条消息
- 当它的所有子进程都完成(或空闲)并且没有更多消息在 C1 到 Cn 之间循环时。
- P 完成接受来自 C1..Cn 的消息,以便将结果返回给其客户端
约束:
- 对我来说空闲是当他们等待接收(阻塞)或只是退出时。
- C1 到 Cn 是有限状态机。它们中的一些或全部可能会将消息发送回 C。或者可能没有消息要发送回 C。即使没有消息发送回 C,C 也必须确定所有这些都已完成,并且之间没有消息他们。
- 如果 C1 到 Cn 中的任何一个被抢占,则认为它很忙(这可能很明显,但我想我会把它放在这里完成)并且 C 不会收到下一条消息
是否有一个 OTP 模式或库可以为我做到这一点(在我破解某些东西之前?)。我知道process_info 可以让我知道进程的邮箱是否为空,我可以继续从 P 检查孩子的邮箱,但从 P 轮询是不必要的。
一般编辑:我正在尝试在 Erlang 平台上实现 Flow Based Programming 的反应变体。这具有“分层流程”或组合的概念,它们本身可能包含组合流程,直到我们到达一些实际代码框...我要去研究(查看监视器、process_info、process_flag)但我想回应你的优秀答案
编辑递归父进程:C1 和 Cn 中的每一个本身都可以是父进程/复合进程。如果我只是产生进程并让它们立即退出,我将不得不每次都创建复合材料链,因为 C1..Cn 本身可能是复合材料(产生复合材料......等等)。最后,当我们到达叶盒(不是复合节点)时,它们应该是有限状态机。所以如果它们是 FSM,我不确定生成并让它们快速退出。
编辑 TKOWAL:由于我正在尝试创建通用父/复合进程,它不知道任务“何时”结束。它所做的只是将它从其子代接收到的消息转发给它的兄弟姐妹,并带有“约束”,即在其子代“完成”之前它不会接受来自其客户端/兄弟姐妹的下一条消息。孩子 C1..Cn 可能不仅发送一条消息,而且发送许多消息。我从您的提议中了解到,wait_for_task_finish 将在收到第一条消息时停止阻塞。但是 P 的孩子也可能发出更多的消息。 P 应该等待所有消息。此外,具有 task_end 符号将因相同的原因不起作用(即,孩子可能会收到多条消息)
【问题讨论】:
标签: erlang erlang-otp