a simple erlang process pool analysis
a simple erlang process pool analysis
这是一个简单的erlang进程池分析,是learn you some erlang for Great Good 里面的一个example,具体的内容可到官网查看!
基本的流程图

实现原理
这个的样例的实现原理官网都有比較具体的说明,主要模块在ppool_serv中,ppool_serv是一个gen_server, 而
 behaviourppool_sup 是一个one_for_all的策略,假设ppool_serv或者worker_sup出现故障,彼此也没有存在的必要了。
这里ppool_serv 和 worker_sup的实现,使用了一个简单的技巧,由于worker_sup不是ppool_sup直接调用生成的,它是由ppool_serv控制生成的:
%% Gen server
init({Limit, MFA, Sup}) ->
%% We need to find the Pid of the worker supervisor from here,
%% but alas, this would be calling the supervisor while it waits for us!
self() ! {start_worker_supervisor, Sup, MFA},
{ok, #state{limit=Limit, refs=gb_sets:empty()}}.
woker_sup由ppool_serv自己在init函数中,发给自己一个Message,然后在回调函数中才生成:
handle_info({start_worker_supervisor, Sup, MFA}, S = #state{}) ->
    {ok, Pid} = supervisor:start_child(Sup, ?SPEC(MFA)),
    link(Pid),
    {noreply, S#state{sup=Pid}};
假设他们一起直接生产,那么会产生死锁,

当然,他这里的生成顺序,能够自己改动一下,也不会出现死锁。
gen_serv的主要数据结构
-define(SPEC(MFA),
{worker_sup,
{ppool_worker_sup, start_link, [MFA]},
temporary,
10000,
supervisor,
[ppool_worker_sup]}). -record(state, {limit=0,
sup,
refs,
queue=queue:new()}).
?SPEC(MFA), 这里的MFA指明一类Task,所以同一个ppool_worker_sup,不会有不同类型的Task,它的策略也是simple_one_for_one.
在这个样例中,使用了一个gen_server -- nnager module 作为Task,这个Task的參数为:{Task, Delay, Max, SendTo}, Task标示任务名字,Delay作为超时时间,仅仅是标示这个任务是有超时限制的,也是一个调试技巧,Max为最大超时次数,SendTo用来发送信息给回调进程,这个进程能够是shell, 假设是shell,flush()就会收到信息。
record 用来标识一些基本的信息,Limit为进程池的限制大小,sup開始为ppool_sup的pid(),在生成woker_sup进程后,就变成worker_sup的进程pid(),由于ppool_serv的主要交流对象还是worker_sup和worker(Task);
 refs(gb_set)为woker的进程链接,这样能够在worker进程down掉或者done时,从线程池中剔除掉;queue为任务队列,当任务大于limit时,就把多余的任务放到queque中,等到进程池有空暇时,就从中pop出任务,接着处理。
这里有些局限的地方:1.每次的任务都是新建的进程去处理,就是说进程的生命周期跟任务的生命周期是一样的,能够把进程跟任务分离出来,让进程不随任务的结束而结束(当然这的任务就不要是gen_server,gen_fsm这些,由于这些也是spawn出来的进程),这样进程开销理论上一次初始化即可了,尽管进程在erlang中开销比較少;2.队列没有限制大小
a simple erlang process pool analysis的更多相关文章
- python的multiprocessing模块进程创建、资源回收-Process,Pool
		
python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork( ...
 - Erlang process structure -- refc binary
		
Erlang 的process 是虚拟机层面的进程,每个Erlang process 都包括一个 pcb(process control block), 一个stack 以及私有heap . 这部分的 ...
 - Erlang Process input queue
		
http://www.cnblogs.com/me-sa/archive/2011/11/05/erlang0012.html Erlang进程有自己的消息队列来保存接收到的消息,新接收到的消息放在队 ...
 - Process Pool实现Python的并行执行
		
参考:Python3.6.2文档 Source code: Lib/concurrent/futures/thread.py and Lib/concurrent/futures/process.py ...
 - 对数据集“dsArea”执行查询失败。 (rsErrorExecutingCommand),Query execution failed for dataset 'dsArea'. (rsErrorExecutingCommand),Manually process the TFS data warehouse and analysis services cube
		
错误提示: 处理报表时出错. (rsProcessingAborted)对数据集“dsArea”执行查询失败. (rsErrorExecutingCommand)Team System 多维数据集或者 ...
 - Erlang pool management -- RabbitMQ worker_pool
		
在RabbitMQ中,pool 是以worker_pool 的形式存在的, 其主要用途之一是对Mnesia transaction 的操作. 而在RabbitMQ 中, pool 中的worker 数 ...
 - Erlang pool management -- Emysql pool
		
从这篇开始,这一系列主要分析在开源社区中,Erlang 相关pool 的管理和使用. 在开源社区,Emysql 是Erlang 较为受欢迎的一个MySQL 驱动. Emysql 对pool 的管理和使 ...
 - Erlang 虚拟机内的内存管理(Lukas Larsson演讲听写稿)
		
Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例: http://www.erlang-fac ...
 - [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集
		
Erlang Resources 小站 2013年7月~12月资讯合集,方便检索. 附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集 小站地 ...
 
随机推荐
- android中利用view画出一条竖线
			
在android中有时候需要通过线条来分割控件.最常见的情形就是在底部选项卡的多个button中间,通过加入一条竖线加以区分或者是在头部导航添加 竖线,将返回键和其他内容区分开来.一般会通过image ...
 - 让乌龟在提交cocos2d-x版本时自动去掉不需要的东东
			
引擎版本:2.1.4 ide:vs2012 一般协作开发情况下,有意思无意将bin.obj等一些目录添加到版本管理中是很烦人的事儿,在VS中不断地编译程序集和提交将带来版本暴增问题.如果你用的是乌龟S ...
 - CSS预处理器实践之Sass、Less比较
			
什么是CSS预处理器? CSS可以让你做很多事情,但它毕竟是给浏览器认的东西,对开发者来说,Css缺乏很多特性,例如变量.常量以及一些编程语法,代码难易组织和维护.这时Css预处理器就应运而生了.Cs ...
 - web本地存储-WebSQL
			
Web SQL数据库API实际上未包含在HTML 5规范之中,它是一个独立的规范,它引入了一套使用SQL操作客户端数据库的API.W3C 官方在 2011 年 11 月声明已经不再维护 Web SQL ...
 - 普林斯顿大学算法课 Algorithm Part I Week 3 自我总结
			
要熟练掌握比较器Comparator public final Comparator<T> MY_COMPARATOR = new myComparator(); //定义比较器 .... ...
 - Recover a file when you use git reset head by mistake.
			
$ git init Initialized empty Git repository in .git/ $ echo "testing reset" > file1 $ g ...
 - magento中的各种form标签
			
1. Text Field $fieldset->addField('title', 'text', array( 'label' => Mage::hel ...
 - Nginx 在安装入门
			
1.首先需要安装必要的库,PCRE,zlib sudo apt-get install libpcre3 libpcre3-dev 假设找不到文件的话就下载源文件进行安装. 2.解压下载的nginx源 ...
 - 服务器:RAID、AHCI、IDE
			
RAID 独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(因此,冗余地)的方法.通过把数据放在多个硬盘上 ...
 - jQuery实现拖动布局并将排序结果保存到数据库
			
很多网站的拖动布局的例子都是采用浏览器的COOKIE来记录用户拖动模块的位置,也就是说拖动后各模块的排序位置信息是记录在客户端的cookie里的.当用户清空客户端的cookie或浏览器的cookie过 ...