使用EventMachine

译自:Playing with eventmachine

最近这几周,我在工作中用了好几次 Ruby EventMachine,虽然它的 RDoc 还不错,但要是真想搞明白这玩意儿恐怕还是要花些功夫,所以我就写了这篇文章。

首先要弄明白的是,究竟什么是EventMachine,在什么场景会用到它。简而言之,EM(EventMachine)是个事件循环监听器(Event loop)。一旦你使用了EventMachine,它便随着ruby的主线程启动,然后去做他自己该做的事情。EM可以监听sockets、监听文件描述符、控制定时器等大量的事情。当你监听的事件触发时,EM会触发你的回调方法,如此一来你便可以处理这些事件,处理完之后再把事件控制权交还给EventMachine。

你也可以让EventMachine执行一大堆和你主要逻辑无关的代码,当这一大堆代码执行完的时候再让回调方法在主要逻辑连接上的任何请求上执行。

我们来用一段代码增进对它的理解:

例1.定时器:

我们来瞧一下这段简单的代码吧。在程序执行之前,需要先安装好 Eventmchine,我们可以通过rubygems来安装(gem install eventmachine),然后我们在程序里引入需要的部分(require 'eventmachine')。你可能会奇怪为什么我有的地方用了EventMachine,有的地方用了EM,其实他们是一样的,你可以随意对调。EM写起来比较短,不过我有时候也会用EventMachine。EventMachine#run方法用来开启主事件循环监听,在这段代码块里你可以添加自己希望的各种功能,比如某种服务,或者定时器之类。

在这个例子里我添加了两个定时器。用EM#add_timer我添加了一个过3秒后执行的定时任务,我还用EM#add_periodic_timer建立了一个每过1秒都会执行的定时器。他们都会在事件触发的时候调用代码块里的方法。

每秒执行一次的定时器里,我们只是让他 puts 一些东西,而3秒的那个定时器里我们则调用了EM#stop_event_loop。EM#stop_event_loop会停掉EventMachine的事件循环监听。一旦整个事件循环监听结束的时候,程序会执行EM#run代码块之后的程序,也就是puts "All done"。

所以,在整个事件循环监听结束之后,EM#run才会停止执行。当然,程序执行结束就是这种情况之一。

例2.某服务:

我们在EM#run代码块里使用了EM#start_server,EM#start_server将让EventMachine监听localhost指向IP地址的8080端口,每个连接里使用一个匿名类来包含Server模块。当然了,你也可以把Server定义成继承自EventMachine:Connection的一个类。

这里有一点要指出的是,实例化的对象只能在存在于某个连接中,你没有办法在多个连接里面共享这个对象里的数据。

但是如果想要这些数据怎么办?你可以在这些对象创建完以后传递你想要的数据。

例3.某服务-2:

EM#start_server方法会在保存连接的对象中产生一个代码块,你可以把你任何想要传递的数据放进去。

好啦,大概就讲这么多,我希望这个快速入门能对你有用。

ps.头次翻译别人的文章,如果那里不对,还请帮忙指出,谢谢。

发表评论

电子邮件地址不会被公开。 必填项已用*标注