有两种情况需要考虑使用进程池管理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
分享到:
相关推荐
Worker Pool 是一个Erlang进程池,其中的工作进程是Erlang的gen server模式进程。Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器...
varpool:Erlang进程池作为局部变量
在这个特定的压缩包中,我们关注的是OTP进程池应用程序,这通常指的是Erlang中的一个设计模式,它允许开发者有效地管理和复用进程资源,提高系统的性能和效率。 在Erlang中,进程是非常轻量级的执行单元,它们可以...
基于ETS的Erlang进程的Erlang循环负载均衡器 erlpool做什么 Erlpool是用于Erlang进程的循环负载均衡器,主要用于与数据库连接之类的事情。 与和相比, erlpool非常简单且很小(〜100 LOC),并且没有关于工人的假设...
- **监督树**:Erlang支持构建监督树来管理进程间的依赖关系,增强系统的整体稳定性。 - **跨平台支持**:ERTS可以在多种操作系统上运行,包括Solaris、Linux、FreeBSD、Mac OS和Windows等。 通过深入了解Erlang VM...
4. **并发与多线程**:由于Erlang的轻量级进程模型,这个库可能使用进程池来并行处理多个转换任务,提高效率。 5. **内存管理**:Erlang Lib of Iconv是如何管理内存的,特别是在处理大文件或大量数据时。 **工具...
8. **连接池**:为了优化性能,可能会采用连接池策略,预先创建一定数量的进程来处理连接,避免频繁创建和销毁进程的开销。 9. **协议解析**:根据应用需求,可能需要对收到的数据进行特定协议的解析。Erlang的模式...
2. 消息传递:Erlang进程间的通信主要依赖于异步的消息传递。一个进程可以向另一个进程发送消息,然后继续执行其自己的任务,而接收进程会在适当的时候处理接收到的消息。 3. 监听器(Ports):除了进程,Erlang还...
3. **并发处理增强**:Erlang天生适合并发,改进可能包含对多线程或进程通信的优化,使得protobuf消息处理能够更好地并行化。 4. **错误处理与容错**:可能增强了错误检测和恢复机制,使得在数据损坏或不一致的情况...
Erlang的MySQL驱动接口允许我们通过Erlang进程与MySQL服务器建立连接。连接过程通常包括设置连接参数(如主机名、端口、用户名、密码和数据库名),然后调用相应的函数来建立连接。这个过程是异步的,符合Erlang并发...
HotTub是一个简单,快速,永久的erlang工作池。 目标 始终保持一定数量的工作进程活动。 在所有情况下,使用工作进程都尽可能减少延迟。 仅将闭包用作公共接口,以避免由于错误而丢失工作进程或丢失对池类型调用的...
- **高级抽象**:OTP提供了许多高级抽象,如进程池、定时器、热更新等,使得开发者能够快速构建复杂系统。 #### 四、构建生产系统 - **缓存系统**:书中通过实施缓存系统介绍了如何利用Erlang的并发特性和OTP提供的...
1. **Erlang语言特性**:Erlang的并发模型(进程)、轻量级线程、热代码升级、错误恢复机制等在hackney库中是如何体现的,以及如何利用这些特性来实现高效、可靠的HTTP请求。 2. **HTTP协议支持**:hackney支持的...
资源池项目是用Erlang编写的一个小型库。 该工具的目标是通过在多个进程之间重用相同的资源来减少创建新资源的开销。 实现的结果是更好的性能和吞吐量。 资源池的灵感来自Java Apache的公共池,并采用了该项目的API...
数据库选用mysql,应该会用到第三方库去连接,用一些进程池去处理IO操作 逻辑模块: 包含场景管理、怪物管理、人物管理、战斗逻辑等相关的游戏逻辑 项目编译和运行脚本都在'script'文件夹下,暂时只支持windows和...
3. **性能优化**:考虑到Erlang的并发优势,服务器可能实现了高效的资源管理,如连接池和流管理,以充分利用硬件资源并提高吞吐量。 4. **测试和调试**:为了确保服务器的稳定性和正确性,项目可能包括了全面的单元...
用于Erlang的ErlMysql MySQL客户端版权所有(c)2010-2014 Alexei Krasnopolski 作者: “ Alexei ”( )。... 顶层组件是数据源管理器(datalang_sup Erlang模块),它监视子数据源进程(数据源是一个连接池)。
- Erlang的进程模型使得每个TCP连接可以作为一个独立的进程运行,这样可以实现并发处理多个连接,提高系统性能。 - 进程间通过消息传递进行通信,保证了系统的并行性和容错性。 3. **tcp_client设计原则**: - ...
5. **Erlang进程池**:Erlang过程池是cpg的另一个关键组件,它管理一组可重用的Erlang进程,以提高资源利用率并避免频繁创建和销毁进程带来的开销。进程池可以预先配置一定数量的进程,为系统提供稳定的处理能力。 ...
1. **异步操作**:erldis 支持异步命令执行,这意味着在等待 Redis 响应的同时,Erlang 进程可以继续执行其他任务,从而提高系统整体性能。 2. **完整的 Redis 命令支持**:erldis 实现了 Redis 的大部分命令,包括...