关于erlang的进程池

有两种情况需要考虑使用进程池管理erlang进程。

一种是普通erlang进程,很便宜,一次可以并行很多(默认32K,当然可以调整vm参数设置更大),但是这不意味着可以无限制的使用,实际上轻松的达到上限是很容易的(想想发明国际象棋的那位向国王请赏的办法,类似的,一个进程开两个,两个再开四个,四个再开8个。。。。,很容易就达到了上限),因此有时候我们需要对进程进行管理,避免无限制的使用累垮系统。

另一种是比较特殊的erlang进程,它有特殊的使用,在运行时可能比较耗资源(也比较耗时),就像数据库连接池。

以上都可以用进程池的方式管理同类进程:池的大小是有限的,超出后的进程就只能在池外排队等候了。

可惜官方还没有提供现成的进程池模块。有一些开源的erlang进程池可供选择,比如:[list]
[*][url=http://github.com/devinus/poolboy]poolboy[/url],
[*][url=https://github.com/bfrog/hottub]hottub[/url],
[*][url=https://github.com/aberman/pooly]pooly[/url]
[*]gen_server_pool,
[/list]


[size=x-large]0. 一个进程池的实现例子[/size]

在[url=http://learnyousomeerlang.com/building-otp-applications]Learn Your Some Erlang[/url]中有一个进程池的设计与实现的例子,从中可以了解进程池的设计思路。

简单的说,每个进程池顶端是一个supervisor,它下面有一个gen_server和一个supervisor。后者是simple_one_for_one策略的supervisor,前者管理这个supervisor,例如,前者通知后者创建一个工作进程(通过supervisor:start_child启动工作进程)。


[size=x-large]1. 重型进程用poolboy[/size]

如果有多个进程需要运行,这些进程运行的都是相同的代码(例如某个gen_server模块,或者其它模块只要带有start_link函数),这些进程的特点是比较耗资源,是计算或者IO密集的。例如提供数据库查询的服务进程,建立数据库连接就比较耗时,(当然以后的查询数据库等待结果也可能很费时)。对这类进程,如果临时要用到时新开一个进程,会在数据库连接上先耗去好多时间,这时服务使用者只能干等着。一个很自然的想法就是,不管会不会用到先建立一批连接好数据库的服务进程再说,这些预先启动的服务进程就构成了一个服务进程池,来一个请求就取出一个闲置的服务进程直接使用,用完放回进程池就行了。

poolboy就是干这个的,这是一个开源的erlang进程池,代码量很小,三个程序文件总共不到400行代码。这个模块的结构如图所示。这里比较奇怪的地方是supervisor是直接挂在gen_fsm下的。这打破了我的一个思维定思,以前一直认为supervisor也应该挂在supervisor下。
[img]http://dl.iteye.com/upload/attachment/0068/8737/a6d3d273-2243-368b-80f7-de659a5714d4.png[/img]

poolboy比较适合为重量级的进程建池。重量级是指进程的创建和使用比较耗资源,一般这类进程的总量也有限度。如果是那种轻量级的进程,例如生存时间很短、用完就扔、数量多少也不定的进程,似乎并不适合poolboy。这类进程可参考[url=http://learnyousomeerlang.com/building-applications-with-otp]Build applications with OTP[/url]的进程池例子。

使用:
从进程池中取出服务进程,使用,用完后归还给进程池:
Worker = poolboy:checkout(PoolName), 
Reply = gen_server:call(Worker, WorkerFun),
poolboy:checkin(PoolName, Worker),
Reply.


[url=https://github.com/devinus/poolboy]README文档[/url]很详尽了,源代码很少也好懂。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值