gpt4 book ai didi

erlang - 是否应该将客户端处理过程添加到主管树中?

转载 作者:行者123 更新时间:2023-12-05 00:44:20 26 4
gpt4 key购买 nike

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

问候,
史蒂夫

最佳答案

是的,您应该将这些进程添加到监督层次结构中,因为您希望它们在您的应用程序停止时正确/优雅地关闭。 (否则,您最终会泄漏连接,这些连接将因它们所依赖的应用程序基础设施被关闭而失败)。

您可以创建一个 simple_one_for_one战略主管说yourapp_client_sup子规范为 {Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary} . temporary type here 很重要,因为连接处理程序通常没有有用的重新启动策略 - 您无法连接到客户端以重新启动连接。 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 的子节点否则 child 将无法使用 socket 。

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

关于erlang - 是否应该将客户端处理过程添加到主管树中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/152744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com