为什么这样运行就像没有线程一样?

Geo*_*Geo 2 ruby windows multithreading ping

我正在编写一个可以ping我的ip范围的脚本.这是我到目前为止所拥有的:

lines = `ipconfig`.split("\n")
thr = []
ip_line = lines.detect { |l| l=~/Ip Address/i }
matcher = /\d+\.\d+\.\d+\.\d+/.match(ip_line)
if matcher.length > 0
    address = matcher[0]
    address.sub!(/\.\d+$/,"")
    (1 .. 254).each do |i|
        xaddr = address + "." + i.to_s
        puts "pinging #{xaddr}"
        thr << Thread.new {
            `ping #{xaddr}` 
        }
    end

    thr.each do |t|
        t.join
        output = t.value
        puts output
    end
end
Run Code Online (Sandbox Code Playgroud)

问题是,这执行得非常慢.就像应用程序没有线程.这是为什么?我注意到如果我将Thread子类化,整个事情运行得更快,更快.怎么了?Thread不是直接用的吗?

ez.*_*ez. 6

Ruby线程由Ruby Interpreter控制.对于操作系统,Ruby Interpreter仍然只是一个进程(就像任何其他进程一样).Ruby Interpreter将一个进程拆分为多个ruby线程.

`ping #{xaddr}`  
Run Code Online (Sandbox Code Playgroud)

由于您要求操作系统执行另一个进程,因此该行强制Ruby解释器暂时放弃其控制权.在'ping'完成之后,ruby解释器才会重新获得控制权.这可能是代码缓慢的原因.