【问题标题】:EventMachine, Redis & EM HTTP RequestEventMachine、Redis 和 EM HTTP 请求
【发布时间】:2011-12-12 16:44:47
【问题描述】:

我尝试从 Redis 存储中读取 URL,并简单地获取 URL 的 HTTP 状态。全部在 EventMachine 中。我不知道我的代码有什么问题,但它不像预期的那样异步。

所有请求都是从第一个到最后一个触发的,奇怪的是我只在最后一个请求之后得到第一个响应(我要检查的 HTTP 标头)。有没有人暗示那里出了什么问题?

require 'eventmachine'
require 'em-hiredis'
require 'em-http'

EM.run do
  @redis = EM::Hiredis.connect
  @redis.errback do |code|
    puts "Error code: #{code}"
  end

  @redis.keys("domain:*") do |domains|
    domains.each do |domain|
      if domain
        http = EM::HttpRequest.new("http://www.#{domain}", :connect_timeout => 1).get
        http.callback do
          puts http.response_header.http_status
        end
      else
        EM.stop
      end
    end
  end
end

我正在为几千个域运行此脚本,因此我希望在发送最后一个请求之前获得第一个响应。

【问题讨论】:

  • 是不是因为通过.each迭代key数组?如何以 eventmachine 的方式对其进行迭代?

标签: ruby asynchronous redis eventmachine


【解决方案1】:

虽然 EventMachine 是异步的,但反应器本身是单线程的。因此,当您的循环正在运行并触发这数千个请求时,在循环退出之前,它们都不会被执行。然后,如果您调用 EM.stop,您将在反应器执行之前停止反应器。

您可以使用 EM::iterator 之类的东西将域的处理分解为块,让反应器执行。然后,如果您真的想要 EM.stop,则需要做一些魔术,方法是在停止反应器之前保留已调度请求和接收到的响应的计数器。

【讨论】:

  • 嘿 dj2,非常感谢您的清晰解释。我缺少好的文档来了解有关 EM 的所有事实。很多新东西要学习;-)
猜你喜欢
  • 2012-08-29
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多