4

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

问候,史蒂夫

4

2 回答 2

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_serverorproc_lib函数(supervisor模块的要求)启动子进程,并且该函数将套接字的控制权转移给子进程,gen_tcp:controlling_process否则子进程将无法使用套接字。

An alternate approach is to create a dummy yourapp_client_sup process that yourclient_connection_handler processes can link to at startup. The yourapp_client_sup process will just exist to propagate EXIT messages from its parent to the connection handler processes. It will need to trap exists and ignore all EXIT messages other than those from its parent. On the whole, I prefer to use the simple_one_for_one supervisor approach.

于 2008-10-07T13:25:40.727 回答
2

如果您希望这些流程很多,那么在您的主要主管下添加一个主管以分离职责可能是一个好主意(并且可能使用该simple_one_for_one设置使事情变得更简单,甚至可能比您当前的情况更简单)。

问题是,如果您需要控制这些流程,最好有一个主管。如果他们成功与否无关紧要,那么您可能不需要一个。但话又说回来,我总是认为那是草率的编码。;-)

我唯一不会做的就是将它们添加到您现有的树中,除非它们的来源非常明显并且它们很少。

于 2008-09-30T18:59:38.787 回答