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月资讯合集 小站地 ...
随机推荐
- Delphi下重载窗体CreateParams翻转关闭按钮
type TForm1 = class(TForm) private { Private declarations } public { Public declarations } ...
- DNS解析服务使用的系统对网站的安全起着很重要的作用
1 采用独享的DNS服务器解析系统 DNS解析服务使用的系统对网站的安全极其重要.现在国内的DNS服务器普遍是公用的,即是你的企业网站DNS解析服务和其他许多网站都是由同一个DNS服务器提供.一旦某个 ...
- 仍需"敬请期待"的微信沃卡
从2013年7月30日广东联通联合腾讯公布将合作推出联通沃卡,到8月5日在易迅网上进行预订,8月8日正式发售,再到本人最近几日拿到预订的实卡,已经过去20多天了.于是乎,我怀着无比期待的 ...
- iOS的category和protocol
很多时候我们需要扩展一下现有的类,增加一点功能.如果有源码,修改一下即可,如果是第三方的库,就要麻烦一些.在C++中我们使用类继承的方法来实现,在ObjectiveC中当然也可以这么做,不过Objec ...
- OpenLayers 添加OpenStreetMap(OSM)瓦片层示例
This article from:http://wiki.openstreetmap.org/wiki/OpenLayers_Simple_Example Deploy an OpenStreetM ...
- POJ1007
2014-08-22 题目意思: 按照各个字符串的逆序数排序(稳定排序,即若A=B,则AB的顺序还是原来的样子) 思路: 求出每个字符串的逆序数后,排序输出即可 代码: //Memory Time ...
- hdu 5540 Secrete Master Plan(水)
Problem Description Master Mind KongMing gave Fei Zhang a secrete master plan stashed × matrix, but ...
- 【找规律】CodeForce #258 Problem A——Game With Sticks
来源:点击打开链接 非常easy.找规律. 每去掉一个点,点的总数量就减去n+m-1,然后看谁最先减到没有点可减.就能够了. #include <iostream> #include &l ...
- 构建一个用于产品介绍的WEB应用
为了让用户更好地了解您的产品功能,您在发布新产品或者升级产品功能的时候,不妨使用一个产品介绍的向导,引导用户熟悉产品功能和流程.本文将给您介绍一款优秀的用于产品介绍的WEB应用. 就像微博或邮箱这类W ...
- node.js(四)path优化(路径优化)
1.normalize函数的基本用法 normalize函数将不符合规范的路径经过格式化转换为标准路径,解析路径中的.与..外,还能去掉多余的斜杠. 如下示例: var path = require( ...