Erlang PoolBoy 源码分析 原 荐

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

来源: my.oschina.net

本文转载自:https://my.oschina.net/gaoxepro/blog/3004170,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

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

没有更多内容

加载失败,请刷新页面

加载更多

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

关注码农网公众号

关注我们,获取更多IT资讯^_^


查看所有标签

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

Python学习手册(第4版)

Python学习手册(第4版)

[美] Mark Lutz / 李军、刘红伟 / 机械工业出版社 / 2011-4 / 119.00元

Google和YouTube由于Python的高可适应性、易于维护以及适合于快速开发而采用它。如果你想要编写高质量、高效的并且易于与其他语言和工具集成的代码,《Python学习手册:第4 版》将帮助你使用Python快速实现这一点,不管你是编程新手还是Python初学者。本书是易于掌握和自学的教程,根据作者Python专家Mark Lutz的著名培训课程编写而成。 《Python学习手册:第......一起来看看 《Python学习手册(第4版)》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具