我正在开发一个有 1 个主管和几个工人的应用程序。这些工作人员中的每一个都将打开一个 tcp 套接字,执行侦听,然后接受连接,在每个客户端到达时为它们生成一个进程(我不介意监督这些)。
我想在应用程序配置中配置监听地址,这样我就可以根据需要有尽可能多的地址来监听(至少需要 1 个地址,但可以指定任意数量)。每个地址都是一个 ip(或主机名)和一个端口地址。到目前为止,没有什么新鲜事。
我的问题是关于如何申报、启动和监督未知数量的工人。我的解决方案是(在运行时)在主管代码中动态生成 init/1 函数的结果,如下所示:
-define(
CHILD(Name, Args),
{Name, {
?MODULE, start_listen, Args
}, permanent, 5000, worker, [?MODULE]
}
).
init([]) ->
{ok, Addresses} = application:get_env(listen),
Children = lists:map(
fun(Address) ->
{X1,X2,X3} = os:timestamp(),
ChildName = string:join([
"Listener-",
integer_to_list(X1),
integer_to_list(X2),
integer_to_list(X3)
], ""),
?CHILD(ChildName, [Address])
end,
Addresses
),
{ok, { {one_for_one, 5, 10}, Children }}.
这允许我为每个工作人员动态生成一个名称,并生成工作人员定义。所以:
这个解决方案可以接受吗?在我看来,它并不那么优雅。这种用例是否有任何标准解决方案(或最佳实践等)?
我知道“simple_one_for_one”策略,它允许动态地将工作人员添加到主管。但是它也可以用来动态生成工人的名字吗?使用“simple_one_for_one”而不是我自己的使用“one_for_one”的解决方案会更好(以任何方式)吗?(再次,对于这种特殊情况)。
提前致谢,很抱歉发了这么长的帖子!:)