首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件驱动编程是如何完成的?

事件驱动编程是如何完成的?
EN

Stack Overflow用户
提问于 2010-10-06 04:59:21
回答 5查看 5K关注 0票数 2

我的问题很简单:事件驱动编程实际上是如何实现的?

更详细地说:我有一个Rails应用程序,每次用户在网站上进行更改时,模型都会将该“更改”写入一个文本文件(JSON)。

我想要做的就是把一个IRC机器人挂到那个“事件”上。(文本文件的创建/修改。)

一般来说,这是如何完成的?它看起来就像是一个无限循环。在伪代码中:

代码语言:javascript
复制
while (I'm Listening)
do
  if (output.txt Is changed)
    process("output.txt")

如果这就是事件驱动编程的实现方式,那么如何避免锁定CPU呢?因为无限循环有这样的趋势吗?

编辑- IRC服务器/机器人托管在本地维护的机器上。Rails应用程序托管在共享服务器上。到目前为止,据我所知,我的IRC机器人与Rails应用程序通信的唯一方式是通过对服务器的HTTP请求(或类似的请求)。正如我所说的,这个问题实际上更一般,因为我想获得事件驱动编程的一般知识。

如果这个问题太简单了,我很抱歉,但我对事件驱动编程的理解只是将预先准备好的事件处理程序附加到使用jQuery的对象上;这在将用Ruby编写的IRC bot附加到文件I/O时真的没有什么帮助。

谢谢你,罗比

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-06 06:43:52

也许你应该创建一个DRb server或者使用一个使用它的解决方案,比如delayed_job。你可以在不同的机器上运行工人。连接是通过连接到服务器上的特殊端口来实现的。您所需要做的就是在防火墙上为运行IRC bot的专用计算机打开此端口。您可以将ruby对象放到队列中,这样就可以通过将ruby对象放到包含此更改的队列中来镜像文件的每个更改。工人会在几秒钟后拿到这个,它不会是瞬间的。但它仍然相当快,占用的CPU很低,并且能够处理网络中断。

票数 1
EN

Stack Overflow用户

发布于 2010-10-06 05:03:45

更常见的情况是这样的:

代码语言:javascript
复制
while (I'm Waiting to be notified) 
do 
  if (output.txt Is changed) 
    process("output.txt") 

在OS (任何OS)中有一些方法可以在不占用CPU时间(例如条件变量)的情况下等待通知。没有事件驱动的循环在那里旋转,等待事件。

票数 4
EN

Stack Overflow用户

发布于 2010-10-06 05:08:24

我熟悉的一个基本模型是通过创建一个公开可以订阅的事件的类来实现的。这可以像一组方法一样简单。

代码语言:javascript
复制
class Foo
  attr_accessor :event  #obviously not the right way to do it, but it will suffice

  def initialize
    @event = []
  end

  private
  def fire_event
    @event.each { |sub| sub.call }
  end
end

现在,该类的客户端可以传入一个方法,该方法希望在触发事件时执行该方法。

代码语言:javascript
复制
f = Foo.new
f.event << lambda { puts 'event was fired' }

当Foo类调用fire_event方法时,将执行过程集合中的每个过程。没有循环不断地检查某些条件。当条件出现时,调用触发方法并执行过程。

顺便说一句,上面的例子只是一个例子。现实世界的事件架构会更健壮,但也是相似的。这可能甚至不适用于你的实际情况,但我不是一个网络爱好者,我不知道RoR和JSON以及所有其他花哨的关键字,所以我选择了高级。希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3867679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档