【发布时间】:2014-06-02 07:05:07
【问题描述】:
我编写了一个 ruby 脚本来并行 ping 多个主机并打印成对的 [host : result]。这是我目前制作的脚本:
require 'thread'
out = ""
queue = Queue.new
hosts = ["www.google.com", "www.onet.pl", "www.lego.com", "www.example.com"]
hosts.each do |x|
queue << x;
end
hash = Hash.new "NO REPLY"
threads = []
NO_OF_THREADS = 4;
for i in 1..NO_OF_THREADS
threads << Thread.new do
until queue.empty? do
host = queue.pop(true) rescue nil
if host
out = `ping #{host} -c 10 | grep 'packet loss'`
hash[host] = out
end
end # until
end # thread
end # for
threads.each do |t|
t.join
end
puts hash
当我将线程数设置为1 时,我得到0% packets lost 响应,但是当我尝试一次执行多个线程时,我得到了很多丢失的数据包。我用一长串要检查的主机和许多线程执行了这个脚本;结果是我列表中的大多数主机丢失了 100% 的数据包。
我尝试与Mutex 同步,而不是使用Queue 并在线程中添加sleep,但我没有提供帮助。在这一点上,我不确定我的代码是否存在问题,或者我误解了 ping 应该如何工作。为什么我丢失了很多数据包?有办法解决吗?
【问题讨论】:
-
您找到解决方案了吗?我也看到数据包丢失,即使只有一个线程在循环中运行
ping。 -
不,抱歉,我不记得找到解决方案了。
标签: ruby linux multithreading ping