gpt4 book ai didi

Ruby 多线程 ping 仅当存在多个线程时才会丢失数据包

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:07 25 4
gpt4 key购买 nike

我编写了一个 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% packetlost响应,但是当我尝试一次执行多个线程时,我得到很多丢失的数据包。我执行这个脚本时使用了一长串要检查的主机和许多线程;结果是我列表中的大多数主机都丢失了 100% 的数据包。

我尝试使用 Mutex 进行同步,而不是使用 Queue 并在线程内添加 sleep,但没有帮助。此时,我不确定我的代码是否存在问题,或者我误解了 ping 的工作原理。为什么我会丢失很多数据包?有办法解决吗?

最佳答案

首先想到的是,并非所有这些主机都一定会允许 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

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

关于Ruby 多线程 ping 仅当存在多个线程时才会丢失数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23988961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com