【问题标题】:multiple ping script keeps pinging the same ips from one list several times多个 ping 脚本不断从一个列表中多次 ping 相同的 ip
【发布时间】:2021-12-04 15:12:55
【问题描述】:

我编写了一个简单的代码,它应该使用线程方法同时 ping 多个 ip。看起来代码运行良好并且能够执行任务,但问题是脚本多次 ping 相同的 ips,尽管线程的range 设置为列表中 ips 的数量。

代码如下:

import os
from threading import *
from time import *


def ipList():
    while True:
        ip = input("Insert an ip")
        ip_list.append(ip)
        if ip == "end":
            ip_list.pop()
            break


def ipPinger(ip_list):
    for ip in ip_list:
        response = os.popen(f"ping -c 4 {ip}").read()
        if "--- " in response:
            result = response[response.find("--- "):]
            print(result)


ip_list = []
ipList()

print(ip_list)

q = input("Are you sure that this is the right list? Y/N")
if q == "Y":
    print("Loading...")
else:
    ipList()

num = 0

for i in range(len(ip_list)):
    t = Thread(target=ipPinger, args=(ip_list[num + i:],))
    t.start()

这是我得到的输出:

Insert an ip8.8.8.8
Insert an ip1.1.1.1
Insert an ip8.8.4.4
Insert an ipend
['8.8.8.8', '1.1.1.1', '8.8.4.4']
Are you sure that this is the right list? Y/NY
Loading...
--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 8.132/9.569/10.592/1.017 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 47.767/48.436/49.066/0.547 ms

--- 8.8.4.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 47.001/47.400/48.047/0.434 ms

上面的 ping 在 4s 之后打印,下面的 ping 在另外 4s 之后打印

--- 1.1.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 8.620/8.661/8.742/0.047 ms

--- 8.8.4.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 47.378/48.118/48.791/0.571 ms

--- 8.8.4.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 47.025/48.122/49.402/1.023 ms

我尝试为线程设置不同的范围,在线程中设置参数的不同方式,但没有找到解决方案。

ps。我完全是代码新手,所以也许我没有看到一些超级明显的东西,但我真的没有在网上找到解决方案,所以只是想了解我在这里做错了什么

【问题讨论】:

    标签: python networking ping


    【解决方案1】:

    似乎问题在于您正在拆分 num+i 和转发的列表,而不是获取 num+i 的索引值。 (另外,由于 num 在你的底部循环中永远不会增加,atm 它没有任何功能)

    假设我有一个如下所示的列表:

    ['1.1.1.1','8.8.8.8','8.8.4.4']
    

    目前,您在生成线程的 3 次迭代中像这样拆分它:

    ['1.1.1.1','8.8.8.8','8.8.4.4']
    ['8.8.8.8','8.8.4.4']
    ['8.8.4.4']
    

    这只是由您在此处生成线程时索引中的 : 运算符引起的:

    for i in range(len(ip_list)):
    t = Thread(target=ipPinger, args=(ip_list[num + i:],)) #Colon operator in indexing
    t.start()
    

    由于您的 IpPing 函数将列表作为参数并循环遍历该列表,因此它将遍历整个列表并针对每个线程对它们全部执行 ping 操作。

    我还希望您考虑,您可能希望生成固定数量的线程或可变数量的线程,而不是为每个 IP 生成一个线程以 ping线程 由用户指定。

    然后让每个线程从同一个列表中弹出值,或者通过锁处理访问该列表。由于这里的 ping 需要很长时间,并且访问对象的时间很短。

    祝你的编码好运! :-)

    编辑:措辞。

    【讨论】:

    • 谢谢你!这真的帮助我了解那里发生了什么。我所做的,我只是用一个修复号替换了线程号,并在索引中添加了 i + 1,现在看起来它工作得很好:) 像这样:args=(ip_list[i:i+1],))
    猜你喜欢
    • 1970-01-01
    • 2023-01-25
    • 2018-01-15
    • 1970-01-01
    • 2012-08-19
    • 2012-02-11
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    相关资源
    最近更新 更多