前段时间用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
- 浏览 3887
- 评论(0)
- 论坛回复 / 浏览 (0 / 2319)
- 查看更多
相关推荐
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 和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:...
使用ruby eventmachine和em-http-server gem,完成一个简单的提供文件下载功能的HttpServer; 使用了EM的FileStreamer来异步发送文件,发送文件时先组装了header,然后调用FileStreamer。 代码: require '...
EventMachine串行端口功能应适用于所有*Ruby口味(包括MRI,jruby;以及各种操作系统,包括linux,windows和apple) (*为所有的某些值) 使用以下gem进行串行端口连接: : 基本上复制了这个gem: : 但将...
安装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....
EventMachine代理DSL,用于在Ruby中编写高性能的透明/拦截代理。 EngineYard教程: 入门 $> gem install em-proxy $> em-proxy Usage: em-proxy [options] -l, --listen [PORT] Port to listen on -d, --duplex ...
EM-HTTP-请求 异步(EventMachine)HTTP客户端,支持: 异步HTTP API,用于执行单个和并行请求保持活动和HTTP流水线支持自动跟随3xx重定向,最大深度自动gzip和deflate解码流响应处理流式上传文件HTTP代理和SOCKS5...
特克勒姆 tkellem 是一个 IRC 保镖,一个代理,让你永久登录到 IRC 服务器并存储所有消息,这样当你的客户端下次连接时,你可以看到你离开时发生的事情的积压。 tkellem 支持多个用户、每个用户的多个独立于设备的...
eventmachine, EventMachine 关于 EventMachine 什么是 EventMachineEventMachine是一个事件驱动的I/O 和 ruby的轻量级并发库。 it I/O 。node.js 。python Twisted 。和 provides提供
玩笑 当您的客户通过 IRC 浏览您的网站时,与他们实时交谈! 演示视频: : ...EventMachine – 基于 Ruby 的事件处理库: : Ponder – 基于 EventMachine 的 IRC 客户端: : Angular – 带有 EDA 的 MVC J
amqp, 基于EventMachine的RabbitMQ客户端更喜欢小兔子 ruby gem: 异步 ruby RabbitMQ客户端是一款功能丰富。基于eventmachine的RabbitMQ客户机,包含了电池。它实现了 ,支持AMQP的 RabbitMQ扩展。警告: 仅在使用...
它建立在Ruby的EventMachine库之上,主要用于处理一些大量的开放连接 (如Comet系统或streaming APIs),整个过程都使用event-driven I/O。 Cramp使用Rails 3.0的ActiveSupport 和 ActiveModel库, 它会显示两层用于...
Ruby Amqp gem:异步Ruby RabbitMQ客户端 是一个功能丰富的基于EventMachine的RabbitMQ客户端,包括电池。 这是Ruby的原始RabbitMQ客户端。 如今,有非常可靠的替代方法可用:用于MRI的和用于JRuby的 。 它实现了...
EventMachine - Ruby的事件驱动I/O和轻量级并发库