Многие недолговечные процессы с глобальным счетчиком процессов - PullRequest
0 голосов
/ 03 января 2012

Мне нужно запустить много недолговечных процессов, которые будут запущены каким-то spawner процессом, эти процессы сами по себе выполняют какую-то работу, сохраняют результат (или делегируют сохранение в какой-то сохраняющий процесс) и затем завершают работу.

И также должен быть некоторый глобальный предел количества параллельно работающих процессов. И я предполагаю, что какая-то очередь, потому что, когда предел достигнут, тогда spawner может продолжать порождать новые процессы, в то время как они, я думаю, должны приостановить и ждать, пока комната запустится.

Может ли эта схема быть легко реализована на эрланге? Имеет ли смысл иметь пул рабочих, чтобы набрать некоторую скорость или просто порождать новый процесс каждый раз, когда все в порядке? Может ли супервайзер simple_one_for_one помочь здесь?

Ответы [ 2 ]

1 голос
/ 03 января 2012

Вы можете легко порождать процесс, как уже указывалось, и ваш процесс порождения может использовать monitor / 2 и счетчик для ограничения и поддержки пула рабочих процессов. Ваш процесс порождения будет порождать начальный набор процессов, отслеживая получающиеся Pids (то есть монитор (process, Pid)) и уменьшая счетчик по мере необходимости. Затем он переходит в receive в ожидании сообщения {'DOWN', MonitorRef, Type, Object, Info}, указывающего, что рабочий был завершен. Как в ...

loop(MaxProcesses, LiveProcesses) ->
    receive
       {'DOWN', _Ref, process, _Pid, _Info} ->
           case LiveProcesses of
               N when N =< MaxProcesses -> 
                   spawn_another() %and monitor new pid
                   loop(MaxProcess, LiveProcesses);
               N when N > MaxProcess -> 
                   loop(MaxProcesses, LiveProcesses -1)
           end
        end
    after  %optional if you want the spawner to potentially do something else
        Timeout->
           do more work
           loop(MaxProcesses, LiveProcesses)
        end
    end.
1 голос
/ 03 января 2012

Вы можете очень легко создавать / порождать процессы, которые ничего не получают, подобно этому:

spawn(fun() -> io:format("Do something and exit~n") end).

Вместо этой печати вы можете просто делегировать или что-то в этом роде. Не уверен, что создание пула для чего-то подобного имеет какой-то смысл, если только эти процессы не выполняются вечно и просто отправляют им сообщения, которые будут делегированы другим сущностям.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...