在Erlang中我有一个主管 - 进程树,包含一个接受tcp / ip连接的进程。对于每个传入连接,我生成一个新进程。是否应将此过程添加到主管树?

此致  史蒂夫

有帮助吗?

解决方案

是的,您应该将这些流程添加到监督层,因为您希望在应用程序停止时正确/正常关闭它们。 (否则,您最终会泄漏连接,因为它们所依赖的应用程序基础架构已关闭而失败)。

您可以创建 simple_one_for_one 策略主管说 yourapp_client_sup ,其子规范为 {Id,{yourapp_client_connection,start_link_with_socket,[]},重启,关机,worker,temporary} 。这里的临时类型很重要,因为连接处理程序通常没有有用的重启策略 - 您无法连接到客户端以重新启动连接。 temporary 这里将导致主管报告连接处理程序退出,否则忽略它。

执行 gen_tcp:accept 的过程将通过执行 supervisor:start_child(yourapp_client_sup,[Socket,Options,...])来创建连接处理程序进程比 yourapp_client_sup:start_link(Socket,Options,...)。确保 youreapp_client_connection:start_link_with_socket 函数通过 gen_server proc_lib 函数启动子代( supervisor 模块的要求并且该函数使用 gen_tcp:controlling_process 将套接字的控制转移给子进程,否则子进程将无法使用套接字。

另一种方法是创建一个虚拟 yourapp_client_sup 进程, yourclient_connection_handler 进程可以在启动时链接到该进程。将存在 yourapp_client_sup 进程以将 EXIT 消息从其父级传播到连接处理程序进程。它将需要陷阱存在并忽略除其父级之外的所有 EXIT 消息。总的来说,我更喜欢使用 simple_one_for_one 主管方法。

其他提示

如果您希望这些流程很多,那么在您的主要主管下添加一个主管以分担责任(并且可能使用 simple_one_for_one 设置来简化事情可能是一个好主意,也许甚至比你现在的情况简单。)

问题是,如果你需要控制这些过程,那么拥有一名主管总是很好的。如果它们成功与否无关紧要,那么你可能不需要它。但话说回来,我总是认为那是邋coding的编码。 ; - )

不会做的唯一事情就是将它们添加到现有的树中,除非它们来自哪里非常明显,而且它们相当少。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top