题
此致 史蒂夫
解决方案
是的,您应该将这些流程添加到监督层,因为您希望在应用程序停止时正确/正常关闭它们。 (否则,您最终会泄漏连接,因为它们所依赖的应用程序基础架构已关闭而失败)。
您可以创建 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的编码。 ; - )
我不会做的唯一事情就是将它们添加到现有的树中,除非它们来自哪里非常明显,而且它们相当少。