PoolBoy

PoolBoy

 source code :

https://github.com/devinus/poolboy

Checkout

ready({checkout, Block, Timeout}, {FromPid, _}=From, State) ->
    #state{supervisor = Sup,
           workers = Workers,
           monitors = Monitors,
           max_overflow = MaxOverflow} = State,
    case queue:out(Workers) of
        {{value, Pid}, Left} ->
            Ref = erlang:monitor(process, FromPid),
            true = ets:insert(Monitors, {Pid, Ref}),
            NextState = case queue:is_empty(Left) of
                true when MaxOverflow < 1 -> full;
                true -> overflow;
                false -> ready
            end,
            {reply, Pid, NextState, State#state{workers=Left}};
        {empty, Empty} when MaxOverflow > 0 ->
            {Pid, Ref} = new_worker(Sup, FromPid),
            true = ets:insert(Monitors, {Pid, Ref}),
            {reply, Pid, overflow, State#state{workers=Empty, overflow=1}};
        {empty, Empty} when Block =:= false ->
            {reply, full, full, State#state{workers=Empty}};
        {empty, Empty} ->
            Waiting = add_waiting(From, Timeout, State#state.waiting),
            {next_state, full, State#state{workers=Empty, waiting=Waiting}}
    end;

Checkout出一个workerworker Queue中,如果有,则monitor(ets)这个worker,然后根据队列的容量和MaxOverflow的值来确定下一状态为full,overflow,ready (ready + overflow <= full);如果没有,而MaxOverFlow的值大于0,则新建一个worker,并将其加入monitor,最后重置状态项worker = emptyoverflow = 1;如果没有,并且MaxOverflow 小于1, Block == false,则{reply, full, full, State#state{workers=Empty}};如过没有,MaxOverflow < 1Block == true,则 {next_state, full, State#state{workers=Empty, waiting=Waiting}}

Checkin

ready({checkin, Pid}, State) ->
    Monitors = State#state.monitors,
    case ets:lookup(Monitors, Pid) of
        [{Pid, Ref}] ->
            true = erlang:demonitor(Ref),
            true = ets:delete(Monitors, Pid),
            Workers = queue:in(Pid, State#state.workers),
            {next_state, ready, State#state{workers=Workers}};
        [] ->
            {next_state, ready, State}
    end;

Monitor中剔除对应的worker,然后回收到worker queue中去。

状态转变

状态转变的计算:

worker_queue_size(当前size) + maxoverflow 。

ready只与当前worker_queque_size有关,overflow 和worker_queue_size(0)maxoverflow>0有关,full 和work_queue_size(0), overfllow = maxoverflow有关。

worker的来源

所有的worker要么在初始化时创建平;要么调用checkout时,经过poolboy创建,但此时创建的worker没有进到worker queue,要想进到worker queue,只能调用checkin

work pid 回收到worker_queue中

checkin_while_full --》{empty, Empty} when MaxOverflow < 1 ->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值