PoolBoy

PoolBoy

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

PoolBoy

 source code :

https://github.com/devinus/poolboy

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 ->

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117047.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月11日 下午4:00
下一篇 2022年1月11日 下午4:00


相关推荐

  • ByteBuffer的allocate和allocateDirect

    ByteBuffer的allocate和allocateDirect在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:Java代码publics

    2022年7月3日
    26
  • tcp缓冲区

    tcp缓冲区一 先上结论什么是 tcp 缓冲区 每个 socket 被创建后 都会分配两个缓冲区 输入缓冲区和输出缓冲区 二 缓冲区的意义 write send 并不立即向网络中传输数据 而是先将数据写入缓冲区中 再由 TCP 协议将数据从缓冲区发送到目标机器 一旦将数据写入到缓冲区 函数就可以成功返回 不管它们有没有到达目标机器 也不管它们何时被发送到网络 这些都是 TCP 协议负责的事情 TCP 协议

    2026年3月16日
    2
  • 关于PyCharm无法启动的问题

    关于PyCharm无法启动的问题问题描述 双击 pycharm 后 鼠标转一圈就没反应了打不开在网上找到了一个解答 你下载的应该是官方版的 然后自己加了网上下载的 jar 激活成功教程插件 并添加了这个插件的路径到 vmoptions 文件 打不开是因为你修改了 pycharm 路径上的某个文件夹名 导致一开始添加的激活成功教程插件路径改变 你只要在 vmoptions 中修改为正确的插件路径即可恢复正常 但是看着是不是有点晕具体做法 1

    2026年3月27日
    2
  • cBridge 2.0 测试网上线!

    cBridge 2.0 测试网上线!我们在上个月末发布了cBridge2.0计划,现在我们很高兴地向大家宣布,cBridge2.0测试网正式启动!cBridge2.0建立的目的是为用户提供更简单的操作体验,它具有高度可扩展和足够深度的多链流动性管理系统,每日为用户提供数十亿美元的跨链转账流动性。用户和流动性提供者(LPs)可以通过test-cbridge-v2.celer.network访问cBridge2.0测试网,熟悉更简单的跨链转账流程,全新的流动性管理和流动性挖矿功能。随着测试网上线,我们同时推出了一…

    2022年6月4日
    43
  • java memorystream 包_MemoryStream

    java memorystream 包_MemoryStreamMemoryStream 位于 System IO 命名空间 为系统内存提供流式的读写操作 常作为其他流数据交换时的中间对象操作 1 MemoryStream 类封装一个字节数组 在构造实例时可以使用一个字节数组作为参数 但是数组的长度无法调整 使用默认无参数构造函数创建实例 可以使用 Write 方法写入 随着字节数据的写入 数组的大小自动调整 2 在对 MemoryStream 类中数据流进行读取时 可以使用

    2026年3月20日
    1
  • pic单片机c语言計數,单片机教程:PIC单片机C语言程序设计(三)

    pic单片机c语言計數,单片机教程:PIC单片机C语言程序设计(三)八 C 语言的数组和 LED 数码显示 C 语言中的数组也是其重要内容之一 在以下介绍的 LED 数码管显示时 大家会看到它的用途 数组是由同种类型变量组成的集合体 在使用这些变量时 可用同一自定义的标识符命名 如在 LED 数码管显示字段时 用的数组自定义名为 SEG7 数组可以是一维的 也可以是多维的 这里主要介绍 维数组及其应用 1 一维数组表达式 类型说明符数组名 常量 方括号中常量又称下标 例如数组 in

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号