【问题标题】:Many short-living processes with global process counter许多具有全局进程计数器的短期进程
【发布时间】:2012-01-04 02:12:52
【问题描述】:

我需要启动许多短期进程,由某种spawner 进程启动,这些进程自己做一些工作,保存结果(或将保存委托给某个保护进程)然后退出。

并且还应该对并行运行的进程数量有一些全局限制。我想是某种队列,因为当达到限制时,spawner 可以继续生成新进程,而我猜它们应该暂停并等待房间运行。

这个方案可以在 erlang 中轻松实现吗?让工人池获得一些速度或每次都产生新进程是否有意义?主管 simple_one_for_one 可以帮忙吗?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    正如已经指出的那样,您可以轻松地生成进程,并且您的生成进程可以使用 monitor/2 和计数器来限制和维护您的工作进程池。您的生成进程将生成一组初始进程,监控生成的 Pid(即 monitor(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.
    

    【讨论】:

      【解决方案2】:

      您可以非常轻松地创建/生成不进行任何接收的进程,类似于:

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

      代替打印,您可以委托或其他方式。不确定为类似的东西创建一个池是否有任何意义,除非这些进程永远运行并且只是为了向它们发送将被委托给其他实体的消息。

      HTH

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 2017-07-03
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 2015-04-06
        • 1970-01-01
        相关资源
        最近更新 更多