2

Celluloid::IO用来做 DNS 查询,下面是我的代码:

require 'celluloid/io'

class MyResolver
    include Celluloid::IO

    def initialize
        @resolver = DNSResolver.new
    end 

    def resolve(domain)
        ips = @resolver.resolve domain

        #sleep 1
        return {domain: domain, ip: ips}
    end 
end

pool = MyResolver.pool(size: 5)

domains = [ 
    'www.google.com',
    ## many other record
]

futures = domains.map {|d| pool.future.resolve(d)}

futures.each do |future|
    puts "#{future.value}"
end

此代码工作并在几秒钟内完成。但是当我添加该行时sleep 1(仅用于学习目的),在打印了一些结果后,进程永远阻塞了,这很奇怪。

谢谢你的帮助。

4

2 回答 2

1

sleep是 中的一个被覆盖的关键字Celluloid,所以如果你想要它本身,请sleep使用. 但话虽如此,截至您描述的此错误的分支不存在(不再存在?)。RubyKernel.sleep0.17.0-dependentCelluoid::IO

我使用您的可重现失败案例来测试以 版本发布的新gem celluloid-pool,并且它原样工作没有问题。0.17.0Celluloid sleep 1

于 2015-05-04T03:32:58.010 回答
0

至少在这种情况下,DNSResolver 有问题,但您可以使用标准 ruby​​ 库中的“线程感知 DNS 解析器” Resolv - 没有任何具有约 25k 域数组的块。不要忘记从 Resolv 中捕获异常。

于 2014-09-24T04:44:29.710 回答