`
cryolite
  • 浏览: 573023 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于erlang的进程池

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

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

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

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

可惜官方还没有提供现成的进程池模块。有一些开源的erlang进程池可供选择,比如:


0. 一个进程池的实现例子

Learn Your Some Erlang中有一个进程池的设计与实现的例子,从中可以了解进程池的设计思路。

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


1. 重型进程用poolboy

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

poolboy就是干这个的,这是一个开源的erlang进程池,代码量很小,三个程序文件总共不到400行代码。这个模块的结构如图所示。这里比较奇怪的地方是supervisor是直接挂在gen_fsm下的。这打破了我的一个思维定思,以前一直认为supervisor也应该挂在supervisor下。


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

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


README文档很详尽了,源代码很少也好懂。
  • 大小: 115.9 KB
分享到:
评论

相关推荐

    Erlang进程池WorkerPool.zip

    Worker Pool 是一个Erlang进程池,其中的工作进程是Erlang的gen server模式进程。Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器...

    varpool:Erlang进程池作为局部变量

    varpool:Erlang进程池作为局部变量

    OTP进程池应用程序_Erlang_Makefile_下载.zip

    OTP进程池应用程序_Erlang_Makefile_下载.zip

    erlpool:基于ETS的Erlang进程的Erlang循环负载均衡器

    基于ETS的Erlang进程的Erlang循环负载均衡器 erlpool做什么 Erlpool是用于Erlang进程的循环负载均衡器,主要用于与数据库连接之类的事情。 与和相比, erlpool非常简单且很小(〜100 LOC),并且没有关于工人的假设...

    hottub:简单,快速,永久的Erlang工作池

    HotTub是一个简单,快速,永久的erlang工作池。 目标 始终保持一定数量的工作进程活动。 在所有情况下,使用工作进程都尽可能减少延迟。 仅将闭包用作公共接口,以避免由于错误而丢失工作进程或丢失对池类型调用的...

    Erlang Resource Pool:资源池管理多个进程之间的可重用资源。-开源

    资源池项目是用Erlang编写的一个小型库。 该工具的目标是通过在多个进程之间重用相同的资源来减少创建新资源的开销。 实现的结果是更好的性能和吞吐量。 资源池的灵感来自Java Apache的公共池,并采用了该项目的API...

    ogame:由Erlang语言编写的游戏服务器

    数据库选用mysql,应该会用到第三方库去连接,用一些进程池去处理IO操作 逻辑模块: 包含场景管理、怪物管理、人物管理、战斗逻辑等相关的游戏逻辑 项目编译和运行脚本都在'script'文件夹下,暂时只支持windows和...

    erlmysql:Erlang MySQL驱动程序

    用于Erlang的ErlMysql MySQL客户端版权所有(c)2010-2014 Alexei Krasnopolski 作者: “ Alexei ”( )。... 顶层组件是数据源管理器(datalang_sup Erlang模块),它监视子数据源进程(数据源是一个连接池)。

    barrel_tcp:bucket_tcp是通用的TCP接受器池,在Erlang中具有低延迟

    版本: 2.1 桶是通用的TCP接受器池,在Erlang中具有低延迟。 主要特点: 启动/停止TCP和SSL侦听器可以基于“接受”模型与不同的传输一起使用。 (可以是stcp,uTCP ...) 接受连接时延迟低可以使用任何协议,可以是...

    poolgirl

    poolgirl-一个性感的Erlang工人... 答:Poolboy的工作程序管理器是一个gen_server进程,在拥有大量工作程序的池中,管理器本身可能成为瓶颈,一种可能的解决方案是让多个管理器并使这些负载均衡。 在用例场景中,池工

Global site tag (gtag.js) - Google Analytics