是否应将客户端处理流程添加到主管树?

时间:2008-09-30 12:05:16

标签: erlang supervisor

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

此致  史蒂夫

2 个答案:

答案 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_serverproc_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的编码。 ; - )

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