此致 史蒂夫
答案 0 :(得分:4)
是的,您应该将这些流程添加到监督层,因为您希望在应用程序停止时正确/正常关闭它们。 (否则,您最终会泄漏连接,因为它们所依赖的应用程序基础架构已关闭而失败)。
您可以创建一个simple_one_for_one
策略主管,说yourapp_client_sup
,其子规范为{Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary}
。这里的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
主管方法。
答案 1 :(得分:2)
如果您希望这些流程很多,那么在您的主要主管下添加主管以分离责任(并且可能使用simple_one_for_one
设置使事情更简单,甚至可能比简单更简单,这可能是一个好主意。你现在的情况)。
问题是,如果你需要控制这些过程,那么拥有一名主管总是很好的。如果它们成功与否无关紧要,那么你可能不需要它。但话说回来,我总是认为那是邋coding的编码。 ; - )
我不会做的唯一事情就是将它们添加到现有的树中,除非它们来自哪里非常明显,而且它们相当少。