有没有可能:是的。例如,您可以使用以下主管创建一个包含 1000 个进程的池:
-module (big_supervisor).
-export([start_link/0]).
-behaviour(supervisor).
-export([init/1]).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, {}).
%% @private
init({}) ->
Children = create_child_specs(1000),
RestartStrategy = {one_for_one, 5, 10},
{ok, {RestartStrategy, Children}}.
create_child_specs(Number) ->
[{{child_process,X},{child_process, start_link, []},permanent, 5000, worker,[child_process]} || X <- lists:seq(1,Number)].
这是一个好的架构,我不知道。到目前为止,我发现了 2 种架构:
- 一个有限且明确(按角色)识别的孩子
- 具有一种流程工厂,使用
simple_one_for_one 策略和start_child/2 terminate_child/2 函数按需动态创建任意数量的子代。
还要注意,如果您想生成进程,监督者不是强制性的。在您的解释中,似乎可以在非常有限的时间内创建进程,以便并行计算某些东西。本例有两点说明:
- 不值得生成更多的进程,而不是在 VM 上有效并行运行的线程数。
- 一个例外是,如果在每个进程中实现的工作都必须等待外部信息,例如外部数据库的返回。在这种情况下,生成更多进程可能会很有趣,最佳数量取决于外部访问限制。