Erlang PoolBoy 源码分析
原
荐
字数 1345
阅读 14
收藏 0
问题存疑:
- 1.如何释放使用过的进程,被再次利用
答:通过try after 的方式,try checkout锁定一个进程,after 用完之后释放被锁定的进程 - 2.如果出现初始进程不够了,如果处理
答:如果不够用,判定max_overflow参数,确定是否需要重新创建进程,或者将此使用者放入等待列表中,一旦有新释放的,就马上给他使用,受超时器的影响 - 3.创建新的进程,是如何释放的 答:如果此进程是弹性创建的,则直接释放此进程,如果是work中的进程,则释放使用权
- 4.如果达到最大的创建进程数,又是如何处理的 答:根据block参数确定,是否忽略或者加入等待列表中
- 5.如果创建的进程 答:poolboy_sup 通过sample_one_by_one参数形式,动态调用supervisor:start_child创建进程池中的进程
- 6.为什么需要将初始创建的进程和poolboy进程link起来,有何用意 答:这样就可以将所有的逻辑全部集中在poolboy进程,只是将poolboy_sup当作一个中间件来使用创建进程池中的进程
queue 队列
支持先进先出或者后进先出模式
基本思路
- 1.通过一个外部sup启动一个poolboy进程,poolboy进程再启动一个poolboy_sup进程
- 2.poolboy_sup 就是这个进程池,然后启动若干个进程,但是poolboy进程操纵poolboy_sup进程创建很多个进程,然后将这些进程全部保存在poolboy进程
- poolboy进程并且与poolboy_sup进程创建的进程进行link
- 当外部进程需要进程时直接从poolboy进程入口,然后使用,并且poolboy进程还监控所有使用的外部进程
- 当外部进程down掉后,poolboy进行善后操作,每一个外部进程独享poolboy进程中的一个进程
- 通过try after 方法,先独享进程,用完后,再释放进程
- link的还有一个操作,就是处理poolboy进程池中进程挂掉的情况,先关闭此进程,并进行善后操作,然后,重新启用一个新的进程,带起挂掉的进程
- 主要的接口就是checkout和checkin的两个接口创建
- 数据结构采用queue,有两种方式可选,fifo(先进先出),fofi(后进先出)的方式,遍历整个进程池
- 还采用了一种动态创建进程的机制,就是说,如果发现现有创建的进程不够用了,那就需要创建一个临时的进程,满足使用,当使用完之后,再释放此进程
- 如果在释放的时候,发现还有等待的进程,则继续使用释放的进程,进行执行
启动
- 1.创建两个数据结构,wait:queue:new 保存等待的进程吃中分配的进程,monitors=ets:new()创建一个监控使用进程池中进程的数据
- 2.创建poolboy_sup 监督进程,采用sample_one_by_one 启动,后面采用supervisor:start_child(Sup,Args)启动进程
- 3.设置启动参数:
worker_module:启动进程池的进程模块名
size:进程池中常见size个进程
max_overflow:最多可以弹性创建进程的数量
starategy:lifo|fifo 后进先出|先进先出模式 (一版来说,进程池中的进程没有区别的)
Block:true 允许进程获取等待 false 不允许进程获取等待,在checkout接口中设置 - 4.启动进程池进程 supervisor:start_child(Sup,Args)启动子进程,填充进程池
使用
调用poolboy:transaction(PoolName,Query)
-
工作机制:
1.首先调用checkout获取进程池中的一个进程,调用的是call同步的方法执行,并设置超时时间 2.使用完毕之后,调用checkin释放进程使用
3.如果出现进程池没有进程,就可以通过max_overflow参数配置,确认是否可以生成新的进程以供使用
4.如果没有,则可以通过Block参数,确认是否可以将当前请求放入waiting中,只要有进程释放,就将此进程返回
5.进程使用完毕,则释放此进程的使用权,清理监控数据列表,然后判定是否弹性创建,决定是否释放,如果有等待进程,则将此进程使用权转移使用
异常处理
- 1.使用进程挂掉:调用down的handle_info,清理监控列表和工作列表,以及等待列表
- 2.进程池中进程挂掉:删除监控,重新生成一个进程
执行函数
- checkout 获取一个可用进程
- checkin 释放一个使用进程
- transaction 一个完整的获取和释放进程过程
可能的不足之处
短暂 I/O 任务(比如数据库访问)的大型 worker 池会因为太多迁入和迁出活动而拖垮单个 poolboy 管理器。
-
参考:
Erlang 池管理 maestro Erlang: https://www.oschina.net/p/maestro-erlang
© 著作权归作者所有
共有人打赏支持
上一篇: C++写的一个类似走迷宫算法
下一篇: 关于erlang程序开发
相关文章 最新文章
目录 poolboy 实现思路 进程图 State 结构 关键函数 childspec init newwoker checkout checkin transcation handleinfo 疑问 poolboy poolboy是一个轻量的,通用的,高性能的,高可用的 Er...
suzuiyue
2018/08/22
0
0
Magnus Ahltorp的Mysql Driver里面介绍emysql的缺陷: 1. 隔离不够好, 2.不能伸缩 mysql-otp使用1个进程1个 mysql 连接,隔离得很好。推荐使用。 mysql-otp-poolboy 使用poolboy + erlang-ot...
格通
2016/02/22
21
0
maestro 是 Erlang 池管理程序。 为什么? 短暂 I/O 任务(比如数据库访问)的大型 worker 池会因为太多迁入和迁出活动而拖垮单个 poolboy 管理器。 怎样做? 使用简单的方法,启动多个池;随...
叶秀兰
2015/09/30
381
2
转载自Erlang非业余研究 今天和项仲在部署新系统的时候发现节点间ping不成功的情况,类似 1> net_adm:ping('xx@ip1'). pang 由于这个问题比较普遍,我就记录下一步步的排除步骤. 首先从原理上...
景德真人
2012/03/29
0
0
转载自Erlang非业余研究 本文链接地址: 低成本和高性能MySQL云数据的架构探索 原文地址:http://www.alibabatech.org/article/detail/3405/0?ticket=d69f07f8-b60b-43f8-9572-7d795bb8429d ...
景德真人
2012/10/26
819
2
没有更多内容
加载失败,请刷新页面
加载更多第1章 多表关系实战 1.1 实战1:省和市 方案1:多张表,一对多 方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物) 多对多关系 1.3 实战3:角色和权限 (比如...
stars永恒
今天
7
0
完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...
o0无忧亦无怖
昨天
7
0
1.升级 vim 我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...
Pasenger
昨天
8
0
1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...
noob_chr
昨天
4
0
svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...
临江仙卜算子
昨天
4
0
没有更多内容
加载失败,请刷新页面
加载更多以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 以太坊源码分析(36)ethdb源码分析
- [源码分析] kubelet源码分析(一)之 NewKubeletCommand
- libmodbus源码分析(3)从机(服务端)功能源码分析
- [源码分析] nfs-client-provisioner源码分析
- [源码分析] kubelet源码分析(三)之 Pod的创建
- Spring事务源码分析专题(一)JdbcTemplate使用及源码分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。