Возможно ли это: да.Например, вы можете создать пул из 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
.
Следует также отметить, что супервизоры не обязательны, если вы хотите порождать процессы.В вашем объяснении кажется, что процессы могут быть созданы за очень ограниченное время, чтобы параллельно что-то вычислять.Два замечания в этом случае:
- не стоит создавать больше процессов, чем количество потоков, которые будут эффективно работать параллельно на вашей виртуальной машине.
- одно исключение - если работаДля достижения в каждом процессе придется ждать внешней информации, например, о возврате внешней базы данных.В этом случае может быть интересно порождать больше процессов, оптимальное количество зависит от внешних ограничений доступа.