我尝试从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
我正在为几千个域运行这个脚本,所以我希望在发送最后一个请求之前得到第一个响应。
答案 0 :(得分:2)
虽然EventMachine是异步的,但反应堆本身是单线程的。因此,当您的循环正在运行并触发数千个请求时,它们都不会被执行,直到循环退出。然后,如果你调用EM.stop,你将在执行前停止反应堆。
您可以使用类似EM :: iterator的东西将域处理分解为允许反应器执行的块。然后,如果你真的想要通过在停止反应堆之前保持调度请求的计数器和收到的响应,你需要做一些魔术。