我的问题很简单:事件驱动编程实际上是如何实现的?
更详细地说:我有一个Rails应用程序,每次用户在网站上进行更改时,模型都会将该“更改”写入一个文本文件(JSON)。
我想要做的就是把一个IRC机器人挂到那个“事件”上。(文本文件的创建/修改。)
一般来说,这是如何完成的?它看起来就像是一个无限循环。在伪代码中:
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时真的没有什么帮助。
谢谢你,罗比
发布于 2010-10-06 06:43:52
也许你应该创建一个DRb server或者使用一个使用它的解决方案,比如delayed_job。你可以在不同的机器上运行工人。连接是通过连接到服务器上的特殊端口来实现的。您所需要做的就是在防火墙上为运行IRC bot的专用计算机打开此端口。您可以将ruby对象放到队列中,这样就可以通过将ruby对象放到包含此更改的队列中来镜像文件的每个更改。工人会在几秒钟后拿到这个,它不会是瞬间的。但它仍然相当快,占用的CPU很低,并且能够处理网络中断。
发布于 2010-10-06 05:03:45
更常见的情况是这样的:
while (I'm Waiting to be notified)
do
if (output.txt Is changed)
process("output.txt") 在OS (任何OS)中有一些方法可以在不占用CPU时间(例如条件变量)的情况下等待通知。没有事件驱动的循环在那里旋转,等待事件。
发布于 2010-10-06 05:08:24
我熟悉的一个基本模型是通过创建一个公开可以订阅的事件的类来实现的。这可以像一组方法一样简单。
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现在,该类的客户端可以传入一个方法,该方法希望在触发事件时执行该方法。
f = Foo.new
f.event << lambda { puts 'event was fired' }当Foo类调用fire_event方法时,将执行过程集合中的每个过程。没有循环不断地检查某些条件。当条件出现时,调用触发方法并执行过程。
顺便说一句,上面的例子只是一个例子。现实世界的事件架构会更健壮,但也是相似的。这可能甚至不适用于你的实际情况,但我不是一个网络爱好者,我不知道RoR和JSON以及所有其他花哨的关键字,所以我选择了高级。希望这能有所帮助。
https://stackoverflow.com/questions/3867679
复制相似问题