Ruby异步whois
我用它来执行和解析whois查询。问题是:我需要表现得更多。千千万万。我找到了async包,它听起来非常适合我。这是一个简单的插件,它依赖于红宝石纤维和 我当前执行whois查询的代码如下所示:Ruby异步whois,ruby,asynchronous,eventmachine,whois,Ruby,Asynchronous,Eventmachine,Whois,我用它来执行和解析whois查询。问题是:我需要表现得更多。千千万万。我找到了async包,它听起来非常适合我。这是一个简单的插件,它依赖于红宝石纤维和 我当前执行whois查询的代码如下所示: ... c = Whois::Client.new(:timeout => timeout) r = c.query(domain) ... 安装之后,我正在尝试扩展 我的代码现在看起来像这样,但仍然非常慢: $: << File.dirname(__FILE__) + '/../l
...
c = Whois::Client.new(:timeout => timeout)
r = c.query(domain)
...
安装之后,我正在尝试扩展
我的代码现在看起来像这样,但仍然非常慢:
$: << File.dirname(__FILE__) + '/../lib'
require 'em-whois'
EM.synchrony do
domain = ARGV[0] || "github.com"
$i = 0;
$num = 100;
arr = Array.new($num)
# perform all queries
begin
puts("Inside the loop i = #$i" );
$i += 1;
arr[$i] = Whois.whois(domain);
end while $i < $num
$i = 0;
# get all results
begin
$i += 1;
puts "\r#{domain}\n#{"-" * domain.length}"
[:available?, :status, :expires_on].each do |k|
puts "#{k}: #{arr[$i].properties[k]}"
end
end while $i < $num
EM.stop
end
$:图书馆作者的回答。链接示例
$:图书馆作者的回答。链接示例
$:同时打开与whois服务器的多个连接似乎是永久阻止的好方法。我的问题更符合理论。我需要代码方面的帮助,我知道有一些限制,但很可能是服务器限制了您,而您的代码很好。如果您分析代码,那么它是否需要大量的I/O等待?您需要的不仅仅是代码方面的帮助。这个概念是有缺陷的。同时打开多个与whois服务器的连接似乎是一个永久阻止的好方法。我的问题更具理论性。我需要代码方面的帮助,我知道有一些限制,但很可能是服务器限制了您,而您的代码很好。如果您分析代码,那么它是否需要大量的I/O等待?您需要的不仅仅是代码方面的帮助。这个概念是有缺陷的。我是em whois的作者,并提供了上述代码,我想明确表示,我强烈反对未经授权的whois数据采集。也就是说,上面的解决方案有两个警告:1)它几乎同时触发所有whois查询,可以做进一步的工作来控制请求频率(例如100/s)2)当从单个IP运行时,此脚本快速达到whois速率限制,跨IP代理是另一个考虑事项。第三个警告:3)在生产用例中,例外情况应在“fire and forget”光纤内处理,否则可能永远无法满足退出条件。我是em whois的作者,并提供了上述代码,我想明确表示,我强烈反对未经授权的whois数据采集。也就是说,上面的解决方案有两个警告:1)它几乎同时触发所有whois查询,可以做进一步的工作来控制请求频率(例如100/s)2)当从单个IP运行时,此脚本快速达到whois速率限制,跨IP代理是另一个考虑事项。第三个警告:3)在生产用例中,例外情况应在“火灾和遗忘”光纤内处理,否则可能永远无法满足出口条件。
$: << File.dirname(__FILE__) + '/../lib'
require 'em-whois'
require 'atomic'
# Asynchronous, parallel multi-domain WHOIS lookup
domains = ARGV.empty? ? ["github.com", "google.com", "bing.com", "yahoo.com", "mikejarema.com"] : ARGV
whois = {}
EM.synchrony do
# Progress indicator
EM.add_periodic_timer(0.1) do
STDERR.print "."
end
# Exit condition
EM.add_periodic_timer(0.1) do
if domains.size == whois.keys.size
puts ""
whois.each do |k,v|
if v.properties[:available?]
puts "#{k}: available"
else
puts "#{k}: taken, expires #{v.properties[:expires_on]}"
end
end
EM.stop
end
end
# Async WHOIS lookup - fire and forget via parallel fibers
domains.each do |i|
Fiber.new do
whois[i] = Whois.whois(i)
end.resume
end
end