Erlang 我如何告诉主管启动特定gen_服务器的1000个实例?

Erlang 我如何告诉主管启动特定gen_服务器的1000个实例?,erlang,erlang-supervisor,gen-server,Erlang,Erlang Supervisor,Gen Server,作为解决计算密集型任务的一部分,我希望有1000台gen_服务器执行小任务并更新全局数据库。如何在erlang OTP中实现这一点?在大多数示例中,主管仅管理一台gen_服务器。一个主管可以管理同一个gen_服务器的上千个实例吗 e、 g.假设我想找到一个超长阵列的最大值,每个gen_服务器实例应在阵列的一部分上创建工作并更新全局最小值。是否可能:是。例如,您可以使用以下主管创建1000个进程的池: -module (big_supervisor). -export([start_link/0

作为解决计算密集型任务的一部分,我希望有1000台gen_服务器执行小任务并更新全局数据库。如何在erlang OTP中实现这一点?在大多数示例中,主管仅管理一台gen_服务器。一个主管可以管理同一个gen_服务器的上千个实例吗


e、 g.假设我想找到一个超长阵列的最大值,每个gen_服务器实例应在阵列的一部分上创建工作并更新全局最小值。

是否可能:是。例如,您可以使用以下主管创建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“终止”子级/2函数,根据需要动态创建尽可能多的子级。 还请注意,如果要生成进程,则不必强制使用监控器。在您的解释中,似乎可以在非常有限的时间内创建进程,以便并行计算某些东西。在这种情况下,有两点需要注意:

产生比虚拟机上有效并行运行的线程数量还要多的进程是不值得的。 一个例外是,如果要在每个进程中完成的工作都必须等待外部信息,例如外部数据库的返回。在这种情况下,可能会产生更多的进程,最佳数量取决于外部访问限制。
可能吗:是的。例如,您可以使用以下主管创建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“终止”子级/2函数,根据需要动态创建尽可能多的子级。 还请注意,如果要生成进程,则不必强制使用监控器。在您的解释中,似乎可以在非常有限的时间内创建进程,以便并行计算某些东西。在这种情况下,有两点需要注意:

产生比虚拟机上有效并行运行的线程数量还要多的进程是不值得的。 一个例外是,如果要在每个进程中完成的工作都必须等待外部信息,例如外部数据库的返回。在这种情况下,可能会产生更多的进程,最佳数量取决于外部访问限制。
正如Pascal所说,可以开始一个设定的数字或子项,但您描述的用例可能会更好地使用策略,因为所有子项都是相同的。这使您可以根据需要以较小的成本添加尽可能多的相同类型的子对象。gen_服务器有开销,即使它不是太大,但当你谈论1000个处理数字的进程时,它会带来不同

如果您的进程将做一些非常简单的操作,并且您希望它快速运行,我将考虑不使用GeNyServer,而是只生成产卵过程。为了获得真正的性能,您必须在不同的节点上生成进程,以使用更多的内核。如果您在不同的位置使用机器,还可以使用消息总线作为负载平衡器在节点之间分配工作。这一切都取决于你需要做多少工作


还要记住,Erlang不是处理数字的最佳工具。您可以使用C代码进行处理,并让生成的每个Erlang进程/每个子进程调用一个

正如帕斯卡所说,可以开始一个设定的数字或子项,但您描述的用例可能会更好地使用策略,因为所有子项都是相同的。这使您可以根据需要以较小的成本添加尽可能多的相同类型的子对象。gen_服务器有开销,即使它不是太大,但当你谈论1000个处理数字的进程时,它会带来不同

如果您的进程将做一些非常简单的操作,并且您希望它快速运行,我将考虑不使用GeNyServer,而是只生成产卵过程。为了获得真正的性能,您必须在不同的节点上生成进程,以使用更多的内核。如果您在不同的位置使用机器,还可以使用消息总线作为负载平衡器在节点之间分配工作。这一切都取决于你需要做多少工作

还要记住,Erlang不是处理数字的最佳工具。您可以使用C代码进行处理,并让生成的每个Erlang进程/每个子进程调用一个