Erlang PoolBoy 源码分析 原 荐

栏目: Erlang · 发布时间: 5年前

Erlang PoolBoy 源码分析

  648789030 发布于 昨天 18:32

字数 1345

阅读 14

收藏 0

Supervisor Erlang

程序员们,在北上广你还能买房吗? >>> Erlang PoolBoy 源码分析 原 荐

问题存疑:

  • 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 管理器。

© 著作权归作者所有

共有人打赏支持

上一篇: C++写的一个类似走迷宫算法

下一篇: 关于erlang程序开发

648789030

粉丝 1

博文 16

码字总数 11678

作品 0

广州

程序员

提问

相关文章 最新文章

erlang poolboy 源码剖析

目录 poolboy 实现思路 进程图 State 结构 关键函数 childspec init newwoker checkout checkin transcation handleinfo 疑问 poolboy poolboy是一个轻量的,通用的,高性能的,高可用的 Er...

suzuiyue

2018/08/22

0

0

Erlang PoolBoy 源码分析 原 荐
erlang驱动使用mysql-otp

Magnus Ahltorp的Mysql Driver里面介绍emysql的缺陷: 1. 隔离不够好, 2.不能伸缩 mysql-otp使用1个进程1个 mysql 连接,隔离得很好。推荐使用。 mysql-otp-poolboy 使用poolboy + erlang-ot...

格通

2016/02/22

21

0

Erlang 池管理--maestro Erlang

maestro 是 Erlang 池管理程序。 为什么? 短暂 I/O 任务(比如数据库访问)的大型 worker 池会因为太多迁入和迁出活动而拖垮单个 poolboy 管理器。 怎样做? 使用简单的方法,启动多个池;随...

叶秀兰

2015/09/30

381

2

Erlang节点互联失败原因分析以及解决方案

转载自Erlang非业余研究 今天和项仲在部署新系统的时候发现节点间ping不成功的情况,类似 1> net_adm:ping('xx@ip1'). pang 由于这个问题比较普遍,我就记录下一步步的排除步骤. 首先从原理上...

景德真人

2012/03/29

0

0

(转载)低成本和高性能MySQL云数据的架构探索

转载自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

Erlang PoolBoy 源码分析 原 荐
Mac Vim配置

1.升级 vim 我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger

昨天

8

0

vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr

昨天

4

0

Erlang PoolBoy 源码分析 原 荐
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子

昨天

4

0

没有更多内容

加载失败,请刷新页面

加载更多

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design for Hackers

Design for Hackers

David Kadavy / Wiley / 2011-10-18 / USD 39.99

Discover the techniques behind beautiful design?by deconstructing designs to understand them The term ?hacker? has been redefined to consist of anyone who has an insatiable curiosity as to how thin......一起来看看 《Design for Hackers》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具