码迷,mamicode.com
首页 > 其他好文 > 详细

poolboy的bug

时间:2014-12-06 12:36:33      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   sp   for   on   div   log   bs   

poolboy在checkout工作者进程的时候,每次都取第一个进程,导致就算是用cast异步处理耗时操作,也会被阻塞,换成随机取进程

老代码

handle_call({checkout, Block}, {FromPid, _} = From, State) ->
    #state{supervisor = Sup,
           workers = Workers,
           monitors = Monitors,
           overflow = Overflow,
           max_overflow = MaxOverflow} = State,
    case Workers of
        [Pid | Left] ->
            Ref = erlang:monitor(process, FromPid),
            true = ets:insert(Monitors, {Pid, Ref}),
            {reply, Pid, State#state{workers = Left}};
        [] when MaxOverflow > 0, Overflow < MaxOverflow ->
            {Pid, Ref} = new_worker(Sup, FromPid),
            true = ets:insert(Monitors, {Pid, Ref}),
            {reply, Pid, State#state{overflow = Overflow + 1}};
        [] when Block =:= false ->
            {reply, full, State};
        [] ->
            Ref = erlang:monitor(process, FromPid),
            Waiting = queue:in({From, Ref}, State#state.waiting),
            {noreply, State#state{waiting = Waiting}}
    end;

 

换成

handle_call({checkout, Block}, {FromPid, _} = From, State) ->
    #state{supervisor = Sup,
           workers = Workers,
           monitors = Monitors,
           overflow = Overflow,
           max_overflow = MaxOverflow} = State,

    case length(Workers) of
        0 when MaxOverflow > 0, Overflow < MaxOverflow ->
            {Pid, Ref} = new_worker(Sup, FromPid),
            true = ets:insert(Monitors, {Pid, Ref}),
            {reply, Pid, State#state{overflow = Overflow + 1}};

        0 when Block =:= false ->
            {reply, full, State};

        0 ->
            Ref = erlang:monitor(process, FromPid),
            Waiting = queue:in({From, Ref}, State#state.waiting),
            {noreply, State#state{waiting = Waiting}};

        _ when length(Workers) > 0 ->
            RadomIndex = random:uniform(999999999999) rem length(Workers),
            Pid = lists:nth(RadomIndex,Workers),
            Left = lists:delete(Pid,Workers),
            Ref = erlang:monitor(process, FromPid),
            true = ets:insert(Monitors, {Pid, Ref}),
            {reply, Pid, State#state{workers = Left}}
    end;

 

poolboy的bug

标签:style   blog   color   sp   for   on   div   log   bs   

原文地址:http://www.cnblogs.com/ziyouchutuwenwu/p/4148075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!