• worker_pool的例子


    鉴于poolboy的坑pooler不支持r18,又有在知乎上看到大神推荐worker_pool这个进程池框架(工作者进程在创建时崩溃,worker_pool不受影响),所以研究了下,贴个小例子

    my_pool.erl

     1 -module(my_pool).
     2 
     3 -export([start/0, stop/0]).
     4 -export([my_overrun_handler/1,do_test/0,do_crash/0]).
     5 
     6 start()->
     7   wpool:start(),
     8   start_pool(),
     9   ok.
    10 
    11 stop()->
    12   stop_pool(),
    13   wpool:stop(),
    14   ok.
    15 
    16 start_pool()->
    17   wpool:start_sup_pool(my_pool,
    18     [
    19       {overrun_warning,5000},
    20       {
    21         overrun_handler,{?MODULE,my_overrun_handler}
    22       },
    23       {workers, 2},
    24       {worker, {test_worker, [11111]}}
    25     ]
    26   ),
    27   ok.
    28 
    29 stop_pool()->
    30   wpool:stop_pool(my_pool),
    31   ok.
    32 
    33 my_overrun_handler(Report) ->
    34   io:format("my_overrun_handler ~p~n", [Report]).
    35 
    36 do_test()->
    37   wpool:call(my_pool,{info},best_worker).
    38 
    39 do_crash()->
    40   wpool:call(my_pool,{crash},best_worker).

    test_worker.erl

     1 -module(test_worker).
     2 
     3 -behaviour(gen_server).
     4 
     5 -export([start_link/1, format_status/2]).
     6 -export([init/1, handle_call/3, handle_cast/2,handle_info/2, terminate/2, code_change/3]).
     7 
     8 -record(state, {}).
     9 
    10 start_link([Args]) ->
    11   gen_server:start_link(?MODULE, [Args], []).
    12 
    13 init([Args]) ->
    14   io:format("working thread init ~p,~p~n", [self(), Args]),
    15   process_flag(trap_exit, true),
    16   {ok, #state{}}.
    17 
    18 handle_call({info}, _From, State) ->
    19   io:format("info~n"),
    20   {reply, _Reply = ok, State};
    21 handle_call({crash}, _From, _State) ->
    22   1 = 2,
    23 {noreply, crash};
    24 handle_call(_Request, _From, State) ->
    25 {reply, _Reply = ok, State}.
    26 
    27 handle_cast(_Msg, State) ->
    28   {noreply, State}.
    29 
    30 handle_info({'EXIT', _Pid, Reason}, State) ->
    31   io:format("exit reason ~p~n", [Reason]),
    32   case Reason of
    33     normal ->
    34       io:format("normal exit trapped~n"),
    35       {stop, normal, State};
    36     other ->
    37       io:format("other exit trapped~n"),
    38       {noreply, State}
    39   end;
    40 handle_info(_Info, State) ->
    41   {noreply, State}.
    42 
    43 terminate(_Reason, _State) ->
    44   io:format("terminate ~p,~p,~p~n", [_Reason, _State, self()]),
    45   ok.
    46 
    47 code_change(_OldVsn, State, _Extra) ->
    48   {ok, State}.
    49 
    50 format_status(_Opt, _StatusData) ->
    51   erlang:error(not_implemented).
  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/ziyouchutuwenwu/p/4881075.html
Copyright © 2020-2023  润新知