ruby - EventMachine、Redis 和 EM HTTP 请求

标签 ruby asynchronous redis eventmachine

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

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

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

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

最佳答案

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

您可以使用 EM::iterator 之类的东西将域的处理分解为让 react 器执行的 block 。然后,如果您真的想要 EM.stop,您需要施展魔法,在停止 react 堆之前保留已发送请求和收到响应的计数器。

关于ruby - EventMachine、Redis 和 EM HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7851741/

相关文章:

c# - Action 过滤器 + AspNetRedisProvider

ruby - 乌类图 | Ruby - 无法从系统中删除 Ruby 1.9.2

Javascript/jQuery 变量未给出预期值

c# - C# 中的任务 - 使用 Random 的结果不明确

redis - 如何使用 Redis 作为 Ember 数据存储的持久性?

更新后日志中的 Redis-Sentinel 错误

javascript - 为什么我的 js.erb 文件中没有工作链接

ruby - 如何在 Ruby 中检测和处理不同的 EOL?

ruby-on-rails - 未定义的局部变量或方法 `blog'?

android - 如何添加线程?