PoolBoy

erlang进程池-poolboy源码分析 本文以作者提供的example.erl为入口进行分析 地址 : https://github.com/devinus/poolboy -module(example). -behaviour(application). -behaviour(supervisor). -export([start/0, stop/0, squery/2, equery/3]). -export([start/2,... 阅读详情

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

poolboy erlang poolboy erlang 线程池 一个用erlang写的pool库 立即下载

相关推荐

零成本矩阵玩法:1人运营5个账号的自动化工具链配置(2025全平台实战)

通过“AI内容生产+工具链分发+自动化变现”的组合拳,即使是新手也能实现1人运营5个账号的规模化收益。关键在于选对工具与设计标准化流程。未来,矩阵运营的竞争将聚焦于工具使用效率与数据洞察深度,快人一步者方能抢占先机!

TuFuir的博客 3785

poolboy max_overflow 参数坑

问题 某个服务节点在较低的qps(每秒2000次数据库访问)下, 在worker进程数100, max_overflow进程数100的情况下. 突然性能下降, 每秒只能处理1500次数据库访问. 导致请求处理延时从几MS上升至几百MS, 之后又逐渐恢复. 原因 逐渐把范围缩小至 mongodb poolboy 进程池的 checkout:...

weixin_34400525的博客 3817

手把手推导APM的 sqrt_controller控制器

前言 玩过无人机的朋友对APM应该都不会陌生,如果是搞过多旋翼飞控且读过代码,肯定遇到过sqrt_controller控制器,它频繁的在位置、姿态控制中出现,所以非常有必要搞清楚这个控制原理。 下面以高度控制器为例来分析。 高度控制 APM的高度控制采用PID串级3环控制,即外环位置控制,中间速度控制,内环速度控制,如下图所示。 今天要讨论的sqrt_controller就是应用于位置控制器中。位置控制器的输出是速度控制器的参考reference输入,如果采用单P控制,其输出vel_ref = pos_e

周小逗的博客 3029

poolboy线程池

常规操作: try poolboy:transaction(Pool, fun(Worker) -&gt; erlang:apply(Module, Function, [Worker | ArgRest]) end, infinity) catch Class:Reason when Retries =&lt; 0 -&gt; ...

Phoenix 487

【补充:脑电绘图教程 2】如何手动去除ICA伪迹分量

ICA可以将脑电信号分解为多个IC分量,由每个分量的平均功率地形图可以看出哪些分量属于伪迹,去除伪迹分量后,即可得到“干净”的脑电信号。本教程主要总结如何人工识别出ICA伪迹分量,不涉及ICA的原理讲解。本教程的主要知识来源是ICLabel官网ICLabel致力于自动识别IC分量属于哪种伪迹,并标记伪迹占比,可以在eeglabel中很方便地使用。ICLabel给出了几种常见伪迹的特点,本教程主要是根据ICLabel给出伪迹特点,对自己的数据集手动去除伪迹,以更深入了解自己数据集的质量和伪迹特点。

qq_40735196的博客 4231

对Palantir的本体论的理解

本体论Ontology是Palantir的整个技术架构的核心与基石,它远不止是一个数据模型,而是一个旨在对企业决策本身进行建模的“数字世界的操作系统”。

liuyukuan的专栏 1147

poolboy的坑

poolboy是Erlang中运用非常广泛的进程池库,它有很多优点,使用简单,在很多项目中都能看到它的身影。不过,它也有一些坑,使用时候需要注意。(本文对poolboy的分析基于1.5.1版本) worker创建不能失败 当poolboy初始化的时候,或者当前进程池的worker数量超过默认值,都会新建worker。我们看一下新建worker的代码: new_worker(Sup) ->

云巴YunBa的博客 682

联想拯救者恢复出厂设置全攻略

通过本文介绍的几种方法,你可以轻松地将联想拯救者恢复到出厂系统状态。无论是通过Windows恢复选项、高级启动选项还是一键恢复功能,都能帮助你解决系统问题、清除个人信息或重置软件环境。在重置前,请务必备份重要数据,并确保了解重置的影响。重置完成后,进行适当的系统设置和软件安装,让你的联想拯救者焕然一新,继续为你提供高效、稳定的计算体验。

mmoo_python的博客 3252

打造个性化AI助手:Cherry Studio APP模型配置完全指南

Cherry Studio APP是一款功能强大的AI助手应用,允许用户根据自身需求配置不同的AI模型和服务提供商。本文将详细介绍如何在Cherry Studio APP中进行模型配置,帮助你打造专属于自己的个性化AI助手。 ## 准备工作:安装与初始化 在开始配置模型之前,首先需要确保你已经正确安装了Cherry Studio APP。如果你还没有安装,可以通过以下步骤获取项目源码并进行安装

gitblog_00031的博客 1174

PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)

该篇是学习使用PYNQ开发板,实际上是对ZYNQ PL端AXI_CDMA 核的应用。实验步骤参照官网的教程,一步一步地做,但是由于在硬件资源布置方面与官方教程稍有出入,所以在SDK的源码里也进行了修改。 AXI_CDMA特性: 如果是使用ZYNQ 7系列芯片(可能其他Xilinx也是通用的),xilinx的AXI_CDMA 核有两种传输模式:轮询(poll)和中断(...

YGLeeeon的博客 3521

代码详解——Transformer

对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。当 Decoder 的输入矩阵和 Mask 矩阵输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。然后判断是否传入的mask, 如果有mask (mask参数值不为None),则把mask为0的位置,将对应位置的attn的值设为无穷小的负数。可以发现得到的输出和输入的K,Q,V的大小相同。

zyw2002的博客 7211

关于erlang的进程池

有两种情况需要考虑使用进程池管理erlang进程。 一种是普通erlang进程,很便宜,一次可以并行很多(默认32K,当然可以调整vm参数设置更大),但是这不意味着可以无限制的使用,实际上轻松的达到上限是很容易的(想想发明国际象棋的那位向国王请赏的办法,类似的,一个进程开两个,两个再开四个,四个再开8个。。。。,很容易就达到了上限),因此有时候我们需要对进程进行管理,避免无限制的使用累垮系统...

好记性不如烂博客 471

5.6华为OD机试真题 新系统 - 匹配命令行前缀关键字 (Java/Py/C/C++/Js/Go)

5.6华为OD机试真题 新系统 - 匹配命令行前缀关键字本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2128

erlang poolboy

看mongodb的代码时候看到用了poolboy,poolboy是进程池,代码很简单。 说一下进程池是什么,进程池就是用空间换时间,将一些进程先启动起来,然后使用的时候从池子里拿出来执行,用完后放回去就可以了。 它适用于1.需要快速响应的请求。2.需要消费大量时间创建进程的时候(比如数据库的链接) 3.限制同时又大量的进程产生 ...

牛逼! 947

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

mysql otp poolboy_神奇杜/mysql-otp-poolboy

MySQL/OTP + PoolboyStatus: Beta.MySQL/OTP + Poolboy provides connection pooling forMySQL/OTP usingPoolboy. It contains convenience functions forexecuting SQL queries on a connection in a pool and lets...

weixin_28750379的博客 413

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

mysql otp poolboy_erlang驱动使用mysql-otp

1. 隔离不够好,2.不能伸缩mysql-otp使用1个进程1个mysql连接,隔离得很好。推荐使用。mysql-otp-poolboy使用poolboy + erlang-otp 来形成线程池,使用poolboy来避免线程数量不足或者过多的情况。poolboy automatically reduces workers when there is not work for them.You g...

weixin_34790159的博客 267

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

poolboy简单阅读

poolboy是一个erlang编写的线程池框架,代码很简洁,项目地址:git://github.com/devinus/poolboy.git 具体用法,项目上有对应范例。 现在查看一下源码 首先看看初始化部分: init({PoolArgs, WorkerArgs}) -> process_flag(trap_exit, true), Waiting...

weixin_30367945的博客 403

mysql otp poolboy_cowboy+poolboy+mysql-otp

1、首先添加依赖,启动项{deps, [jsx,{poolboy, {git, "https://github.com/devinus/poolboy.git", {tag, "1.5.2"}}},{mysql, {git, "https://github.com/mysql-otp/mysql-otp.git", {tag, "1.4.0"}}},{cowboy, {git, "https://...

weixin_34997870的博客 178

Poolboy完全指南:轻量级Erlang工作池工厂的终极入门教程

Poolboy是一款轻量级、通用的Erlang工作池工厂,专注于简洁性、高性能和可靠的故障恢复能力。作为GitHub加速计划中的重要项目,它为Erlang应用提供了高效的资源管理解决方案,帮助开发者轻松实现任务分发与并发控制。 ## 📌 什么是Poolboy? Poolboy本质上是一个**工作池管理库**,它通过维护一组预初始化的工作进程,实现了资源的高效复用和请求的快速响应。在高并发场景

gitblog_00050的博客 781
上一篇: avl树 golang实现
下一篇: cowboy 基础使用
laohan_
博客等级 码龄15年 112粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值