zoukankan      html  css  js  c++  java
  • 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 ->

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    51Nod
    51Nod
    51Nod
    51Nod
    51Nod
    51Nod
    51Nod
    51Nod --1133 不重叠的线段
    bzoj2440: [中山市选2011]完全平方数
    第三章:基本HTML结构
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4807678.html
Copyright © 2011-2022 走看看