Tag: 事件机器

EventMachine和Ruby Threads – 这里到底发生了什么?

我们一起使用Rails和EventMachine,当使用与Passenger的组合时,需要完成一些非常具体的设置。 经过大量的试验和错误,我使EventMachine初始化运行良好,但我想更好地理解代码。 正如您在下面的代码片段中所看到的,我们的初始化程序检查Passenger,然后在重新启动EventMachine之前检查它是否是分叉进程。 if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| # for passenger, we need to avoid orphaned threads if forked && EM.reactor_running? EM.stop end Thread.new { EM.run do 我的问题与EM.reactor_running有关? 和EM.stop命令。 如果Passenger已分叉我们的进程,为什么我需要在新线程中重新启动EM引用? 如果EM.reactor_running? 返回true,我引用的EM实例是什么? 您可以在我们的博客上查看完整的初始化代码http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html

Ruby无法覆盖send方法

这有点难以解释,但我似乎偶尔无法覆盖我的应用程序中的’send’方法。 我正在基于EventMachine创建一个相当大的应用程序,有时,在我的代码的深处,我决定在我的一个类中定义一个’send’方法。 当我稍后尝试使用此方法时,我通常会得到类似TypeError: is not a symbol ,例如以下(恰好是由所需的AMQP gem(不是我的)引起的,但是这个问题更一般): Exception caught: TypeError – # is not a symbol /Users/mlartz/.rvm/gems/ruby-1.9.2-p180@rflow-component-devel/gems/amq-client-0.7.0.alpha27/lib/amq/client/queue.rb:137:in `bind’ /Users/mlartz/.rvm/gems/ruby-1.9.2-p180@rflow-component-devel/gems/amqp-0.8.0.rc12/lib/amqp/queue.rb:282:in `block in bind’ /Users/mlartz/.rvm/gems/ruby-1.9.2-p180@rflow-component-devel/gems/eventmachine-1.0.0.beta.3/lib/em/deferrable.rb:47:in `call’ /Users/mlartz/.rvm/gems/ruby-1.9.2-p180@rflow-component-devel/gems/eventmachine-1.0.0.beta.3/lib/em/deferrable.rb:47:in `callback’ 这是违规行: @connection.send(Protocol::Queue::Bind.encode(@channel.id, @name, exchange_name, routing_key, nowait, arguments)) 在这种特殊情况下,@ @connection对象的类定义了一个接收AMQ::Protocol::MethodFrame的send方法。 但是,似乎以某种方式调用了默认的Object#send方法(它需要一个符号,因此是exception)。 在开发早期,我在我的一个自定义类上遇到了同样的问题,通过将“send”方法的名称更改为“send_message”解决了这个问题。 所以,由于这有点笼统,问题是,什么样的事情可能会干扰我在定义它的对象上调用自定义定义的send方法的能力? 仅供参考:我在OSX上使用Ruby 1.9.2p180。

EventMachine和循环

这是我的代码: EventMachine.run { conn = EM::Protocols::HttpClient2.connect request.host, 80 req = conn.get(request.query) req.callback { |response| p(response.status) p(response.headers) p(response.content) } } 回调触发,也就是说,我得到状态的字符串输出等。 但我想要做的就是触发回调,然后重复。 我计划实施更多逻辑,例如每次调整URL,但就目前而言,我只想要: 检索URL 解雇回调 重复… 我对这种模式的理解是,该循环中的所有内容都会触发,然后返回,然后一直持续到我执行EM.stop 。 现在,它检索URL数据,似乎挂起了。 我需要做某种返回才能继续吗? 它为什么悬挂,而不是一遍又一遍地循环? 如果我用循环包围整个上面的代码块…结束它按预期工作..这是实现这个的正确方法吗? 我想我很困惑,因为我认为EM.run所有内容在完成后EM.run重复。

是否可以使用带有Ruby 1.8的EventMachine启动多个并行的http请求

em-synchrony.rb用Fibers实现了这个function,但是我会选择带有1.8 MRI的非光纤版本。 EM.run do http = EM::Protocols::HttpClient2.connect(“www.google.com”, 80) request = http.get(“/”) request.callback do puts request.status EM.stop end end

Http流媒体与瘦&eventmachine

我正在玩EM来实现流媒体和并发。 我遇到了流式传输问题…我运行以下机架应用https://gist.github.com/1394840使用 $ rackup -s thin -p 3000 async_app.ru 在使用$ ab -c 10 -n 20 http://localhost:3000/ ,应用程序似乎接受了parellel请求。 大! 我希望它同时实现流媒体。 当我在Firefox8中测试它时,它运行良好。 使用$ curl -i http://localhost:3000/ ,结果也像预期的那样流式传输! 但后来在IE和Chrome中进行测试时,流式传输失败了,也就是说,三条线路只在请求发出后5秒内一起出现…… 我怀疑如果我错过了浏览器所需的东西? 我注意到没有Transfer-Encoding:chunked在响应头Transfer-Encoding:chunked ,所以它重要吗? 如果是这样,那是Thin的问题吗? 如何使用精简版或Chrome实现流式传输? 谢谢!

如何使用Ruby Eventmachine编写(大)文件

我花了好几天现在为eventmachine找到了一些非echo服务器的例子,但似乎没有。 假设我想编写一个接受文件并将其写入Tempfile的服务器: require ‘rubygems’ require ‘tempfile’ require ‘eventmachine’ module ExampleServer def receive_data(data) f = Tempfile.new(‘random’) f.write(data) ensure f.close end end EventMachine::run { EventMachine::start_server “127.0.0.1”, 8081, ExampleServer puts ‘running example server on 8081′ } 写入文件将阻止反应堆,但我不知道怎么做’Eventmachine风格’。 我是否必须以块的forms读取数据并将每个块写入Em.next_tick块中的磁盘? 感谢Andreas的帮助

如何捕获EventMachine服务器上的顶级故障?

我有一个EventMachine服务器,我用monit监控。 有时会崩溃,我试图找出原因,但我不清楚如何记录所有顶级故障。 我试过这样的代码: begin EventMachine::run do EventMachine::start_server(‘0.0.0.0’, PORT, MyServer) end rescue Exception => e puts “FAILURE: #{e.class}: #{e}” end 但这似乎永远不会发现错误。 我怀疑它可能就像内存耗尽一样,我正在单独跟踪,但我仍然希望这台服务器在可能的情况下记录它的近似失败原因。

单个EventMachine反应器中的多个服务器

是否可以在单个事件计算机中运行多个服务器? 我的意思是单个客户端连接可以同时使用多个服务。 例如,登录服务器对用户进行身份validation,然后用户可以同时使用聊天室和简单游戏(如同一个客户端套接字的检查程序)? 或者我是否需要为每项服务提供多个eventmachine反应器?

在基于EventMachine的应用程序中读取文件的最佳方法是什么?

为了不阻止反应器,我想异步读取文件,但我发现使用EventMachine没有明显的方法。 我尝试了几种不同的方法,但没有一种感觉正确: 只是阅读文件,它会阻止反应堆,但到底是什么,它不是那么慢(除非它是一个大文件,然后它肯定是)。 打开文件进行读取,并在每个刻度线上读取一个块(但读取多少?太多,它会阻塞反应堆,太少,读取速度会慢于必要)。 EM.popen(‘cat some/file’, FileReader)感觉非常奇怪,但比上面的替代方案效果更好。 结合LineAndTextProtocol它可以非常快速地读取线条。 EM.attach ,但我还没有找到任何如何使用它的例子,我在邮件列表上发现的唯一一件事就是它被弃用了… EM.watch ,我没有找到如何用于阅读文件的例子。 如何读取EventMachine反应器循环中的文件?