【问题标题】:Ruby multithreaded ping loses packets only if there is more than one threadRuby 多线程 ping 仅在有多个线程时才会丢失数据包
【发布时间】: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


【解决方案1】:

立即想到的是,并非所有这些主机都一定会允许 ICMP PING 消息。

但是,我运行您的代码,并在主机之间获得 0% 的数据包丢失:

www.google.com10 packets transmitted, 10 packets received, 0.0% packet loss
www.lego.com10 packets transmitted, 10 packets received, 0.0% packet loss
www.onet.pl10 packets transmitted, 10 packets received, 0.0% packet loss
www.example.com10 packets transmitted, 10 packets received, 0.0% packet loss

你在什么上运行你的代码?虚拟机?可能存在一些底层操作系统问题,表现为丢包。

【讨论】:

  • Xubuntu 13.10 on VirtualBox 4.3.6r91406,宿主系统 Windows 7。代码应该部署到不同的 Linux 虚拟机上,所以操作系统问题似乎很让人头疼。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多