前段时间用C++实现过Reactor模式,今天看到InfoQ上对 EventMachine
的介绍,原来也是基于该模式的一个框架,很想借鉴一下成熟作品的实现方式。Google了一下 Reactor Pattern,原来已经有很多成熟作品
了:
The ADAPTIVE Communication Environment
(C++)
Apache MINA
(Java)
POE (Perl)
Twisted (Python)
EventMachine
(Ruby)
使用EventMachine编写网络应用相当简洁,下面是来自EM文档的两个例子:
Server.rb
require 'rubygems'
require 'eventmachine'
module EchoServer
def receive_data data
send_data ">>>you sent: #{data}"
close_connection if data =~ /quit/i
end
end
EventMachine::run {
EventMachine::start_server "192.168.0.100", 8081, EchoServer
}
Client.rb
require 'rubygems'
require 'eventmachine'
module HttpHeaders
def post_init
send_data "GET /\r\n\r\n"
@data = ""
end
def receive_data(data)
@data << data
end
def unbind
if @data =~ /[\n][\r]*[\n]/m
$`.each {|line| puts ">>> #{line}" }
end
EventMachine::stop_event_loop
end
end
EventMachine::run do
EventMachine::connect 'microsoft.com, 80, HttpHeaders
end
对于用户而言,我们关心的是如何向Reactor注册我们关注的事件和相应的处理函数,然而上面的例子中根本就没有相应的代码出现,这就显得有点怪异了,因为我们使用Reactor时,通常都会有构建一个与应用相关的Handler,然后将其注册给Reactor的过程。
其实,我们的直觉是对的,只是EM把这个过程封装起来而已。 EM把Handler抽象为类Connection,里面定义了模板方法,我们可以通过继承该类并覆盖相应的模板方法以实现自己的应用逻辑。
class HttpHeaders < EventMachine::Connection
def initialize *args
super
# whatever else you want to do here
end
#.......your other class code
end # class HttpHeaders
EventMachine::run do
EventMachine::connect 'microsoft.com, 80, HttpHeaders
end
该代码跟上面的Client.rb是完全等价的,EM会自动判断该代码是Class还是Module,如果是后者,则将其mixin进class Connection中。
在实现上,EM没有使用太多花哨的技巧,同时为了提高性能,它的核心组件Reactor使用C++来实现。下面介绍一下几个重要的方法。
1、EventMachine::run
initialize_event_machine #初始化
add_timer 0, block # block 就是传递进来的 EventMachine::connect
run_machine #启动循环
2、EventMachine::connect
#判断传递进来的handler是Class还是Module,如果是后者,则将其mixin进class Connection
klass = if (handler and handler.is_a?(Class))
handler
else
Class.new( Connection ) {handler and include handler}
end
....
s = connect_server server, port #取得TCP连接,获取句柄
c = klass.new s, *args #构建Connection实例
3、Connection覆盖了操作符 new
associate_callback_target sig #在Reactor中注册
post_init
用户通过定义module或者继承Connection后,EM则通过上述方法自动完成事件注册和分派工作,用户只需专心完成应用逻辑即可。此外,EM在Linux2.6环境下,则自动选用epoll来代替select,以获取更好的效率,避免了前者的局限性(存在句柄数量的限制、大句柄集合效率低下)
分享到:
- 2008-08-03 21:05
- 浏览 3936
- 评论(0)
- 论坛回复 / 浏览 (0 / 2356)
- 查看更多
相关推荐
EventMachine::IRC::Server 为 Ruby 的 EventMachine 提供了一个基本的 IRC 服务器。 安装 将此行添加到应用程序的 Gemfile 中: gem 'eventmachine-irc-server' 然后执行: $ bundle 或者自己安装: $ gem ...
EventMachine: 拥有极高的可伸缩性、性能和稳定性,适用于大多数苛刻的生产环境;并且 提供可以消除高性能多线程网络编程的复杂性的API,使得工程师可以专心于产品逻辑本身 标签:EventMachine
关于EventMachine什么是EventMachine EventMachine是用于Ruby的事件驱动的I / O和轻量级并发库。 它使用提供事件驱动的I / O,非常类似于 , ,Python的 , ,libevent和libev。 EventMachine旨在同时满足两个关键...
EventMachine EventMachine是轻量级的,延迟执行的事件发送器。为什么还要一个? 我需要一个事件发射器: 在浏览器中工作; 不是资源消耗(EventMachine仅减少1.4kB); 没有外部依赖关系; 回调在新的堆栈中执行; ...
Ruby承诺在 Ruby 中实现 AngularJS Promises 的轻量级 gem AngularJS Promise 介绍: : 安装将此行添加到应用程序的 Gemfile 中: gem 'ruby-promises'然后执行: $ bundle或者自己安装: $ gem install ruby-...
em-http-request, 异步HTTP客户端( EventMachine + ruby ) EM-HTTP-Request 异步( EventMachine ) HTTP客户端,支持:异步 HTTP API用于单&并行请求执行保持活动状态和HTTP管道支持自动跟随 3xx 重定向最大深度自动 ...
然后,我们使用`EventMachine::FileStreamer`来异步发送文件。这个类会将文件内容分块发送,从而避免一次性加载整个文件到内存中。当文件发送完成后,我们调用`close_connection_after_writing`关闭连接: ```ruby ...
通过建立在 EventMachine 和React器模式上,使用 em-secure-api 构建的 API 服务可以变得快速且可扩展。 只需在单独的端口上运行多个 em-secure-api 服务器并使用 、 或负载平衡。 为什么是 em-secure-api? 已经...
该实现基于Ruby / EventMachine库。 注意:中断更改从0.1.2到0.1.3 。 见下文。 如需帮助,请在此处使用Google: 词汇表 SMSC:SMS中心。 移动运营商通常在其网络中运行SMSC。 SMSC存储并转发SMS消息。 MO:...
3. **EventMachine** 或 **Sidekiq**:用于处理领域事件和后台任务。 ### PHP的DDD实践 虽然PHP常被视为静态类型的脚本语言,但也有实现DDD的库和框架: 1. **Laravel**:流行PHP框架,支持依赖注入和契约,有助...
《Ruby编程,实用程序员指南》是一本针对Ruby语言的学习教程与参考手册,旨在为程序员提供一个全面、深入的Ruby语言学习资源。本书不仅适合初学者快速入门,也适合具有一定经验的开发者进阶学习。 ### 一、Ruby语言...
7. **并发模式**:除了线程,Ruby还提供了其他并发机制,如进程(Process)、Fibers(轻量级线程)和EventMachine(事件循环)。选择哪种模式取决于具体的应用场景。 8. **并发编程最佳实践**:设计线程安全的代码...
EventMachine串行端口功能应适用于所有*Ruby口味(包括MRI,jruby;以及各种操作系统,包括linux,windows和apple) (*为所有的某些值) 使用以下gem进行串行端口连接: : 基本上复制了这个gem: : 但将...
2. **事件驱动**:Puma利用Ruby的事件库,如libuv或eventmachine,实现非阻塞I/O,使服务器能够高效地处理大量并发连接。 3. **热重启**:Puma支持热重启功能,这意味着在不中断服务的情况下可以更新应用程序代码。...
安装sudo gem install twitter-stream -s http://gemcutter.org用法require 'rubygems'require 'twitter/json_stream'EventMachine::run { stream = Twitter::JSONStream.connect( :path => '/1/statuses/filter....
12. **异步编程与并发**:Ruby提供了EventMachine和Concurrent Ruby等库来处理异步编程和并发,利用非阻塞I/O和线程模型。 通过深入学习以上知识点,并结合"9.24"这个可能的章节或日期,你可能会探索到关于Ruby中的...
标题中的"thin.gem"和"eventmachine.gem"指的是两个Ruby编程语言中的 Gems,这是Ruby的软件包管理系统,用于安装和管理库和框架。在Ruby社区,Gems是分享和使用代码的标准方式。 "thin"是一个轻量级的Web服务器,它...
6. **异步支持**:`mongo-ruby-driver`还支持非阻塞I/O,利用Ruby的EventMachine或其他反应器库,可以在单线程环境中处理多个并发连接,提高应用性能。 7. **安全**:驱动程序集成MongoDB的身份验证机制,支持多种...
Simchat 是一个基于 Ruby 的 EventMachine 库构建的极其基础的聊天应用程序,它展示了如何使用 EventMachine 来创建实时通信的服务器。EventMachine 是 Ruby 中一个强大的库,用于处理大量并发连接,尤其适合构建...