Python 多线程。如何正确地同时ping多个IP?

Python 多线程。如何正确地同时ping多个IP?,python,multithreading,Python,Multithreading,我想让控制台程序ping远程IP。我使用多线程同时ping多个IP。当所有IP都可访问时,所有IP看起来都很好,但当一个IP不可访问时,其他线程必须等待很长时间,直到坏的ping完成(我特意选择了一个不可绑定的IP),这是因为join方法会等待所有线程结束。当我刚删除连接方法时,我的电脑崩溃了 为了克服这个问题,我做了以下工作(创建了无限ping函数,因此由于内部的无限方法,没有thead可以结束),并将joinmethod保留在代码中,它工作正常,但有更好的选择吗?我想这个解决方案在资源消耗或

我想让控制台程序ping远程IP。我使用多线程同时ping多个IP。当所有IP都可访问时,所有IP看起来都很好,但当一个IP不可访问时,其他线程必须等待很长时间,直到坏的ping完成(我特意选择了一个不可绑定的IP),这是因为join方法会等待所有线程结束。当我刚删除连接方法时,我的电脑崩溃了

为了克服这个问题,我做了以下工作(创建了无限ping函数,因此由于内部的无限方法,没有thead可以结束),并将joinmethod保留在代码中,它工作正常,但有更好的选择吗?我想这个解决方案在资源消耗或其他方面可能有一些缺点

我的工作代码,对此我有疑问:

以下方法在t100时间间隔内对
b
(IP)执行一次ping

def do_ping(b,t100):
    a=os.system(f"ping -n 1 {b}")
    h=good_time(time.localtime(),1)
    with open(f"noob_{h}_{b}.txt",mode="a") as f:
        t=good_time(time.localtime(),0)
        if(a==int(0)):
             f.write(f"The remote destination {b} is reachable, everyting is enter code hereOKAY. {t} \n")
        elif(a==int(1)):
            f.write(f"Ping {b} failed! {t} \n") 
            time.sleep(int(t100))
一个IP地址的无限ping:

def ping1(b,t100):
     while(True):   
          IP_Op.do_ping(b,t100)
主程序:

while(True):
    treadsN=[]
    for i in b:
b
是IP列表(整个程序也会将结果写入文件中,如果ping长期失败,将来会发送电子邮件)

treadsN.append(threading.Thread(target=IP_Op.ping1, args=(i,3)))
     for i in treadsN:
          i.start()

      for i in treadsN:
           i.join()

您不需要线程来执行多个进程-只需使用
subprocess.Popen
-它不会像
os.system
那样阻塞,因此您可以多次运行它,它们都将并行运行

如果
b
是包含所有IP的列表:

import subprocess

while True:
    result = []
    for ip in b:
        p = subprocess.Popen(['ping', '-n', '1', ip]) # runs ping in background
        result.append(p) # store the Popen object for later result retrieval
这将在后台运行多个
ping
进程!现在您只需解析结果:

    try_again = []
    for ip, p in zip(b, result):
        if p.wait() == 0:
            print(ip, 'is ok!')
        else:
            print(ip, 'failed!')
            try_again.append(ip)
然后,如果需要,可以重复失败的步骤:

    if not try_again:
        break
    time.sleep(100)
    b = try_again

您不需要线程来执行多个进程-只需使用
subprocess.Popen
-它不会像
os.system
那样阻塞,因此您可以多次运行它,它们都将并行运行

如果
b
是包含所有IP的列表:

import subprocess

while True:
    result = []
    for ip in b:
        p = subprocess.Popen(['ping', '-n', '1', ip]) # runs ping in background
        result.append(p) # store the Popen object for later result retrieval
这将在后台运行多个
ping
进程!现在您只需解析结果:

    try_again = []
    for ip, p in zip(b, result):
        if p.wait() == 0:
            print(ip, 'is ok!')
        else:
            print(ip, 'failed!')
            try_again.append(ip)
然后,如果需要,可以重复失败的步骤:

    if not try_again:
        break
    time.sleep(100)
    b = try_again

你从未存在过线程,因此你从未真正连接回主线程。等待一个坏的线程有什么问题?看起来没问题。最糟糕的情况可能是等待一个坏的端点(由于您并行ping,多个没有响应的地址的超时时间将大致相同。您好,代码按您所说的那样工作,我得到了正确的结果,但将来我想添加类似击键的事件,它不会停止ping,而是返回初始设置菜单(脚本中的问题列表)要添加或删除某些IP。建议我执行以下操作,请参阅下一条消息。建议哪个是givven:一般来说,您的设计应该使用调度程序和队列。调度程序用任务填充队列。每个线程正在队列中等待某个任务。当线程获得某个任务时,它将执行该任务并将值返回给dispatcher。这样,每件事都是相互独立的。单个线程的速度和速度没有区别。它以自己的速度运行,独立于任何其他线程。你永远不存在线程,所以你永远不会真正连接回主线程。等待一个坏线程有什么问题?看起来没问题。哟最糟糕的情况可能是等待一个坏的端点(由于您并行ping,多个没有响应的地址的超时时间将大致相同。您好,代码按您所说的那样工作,我得到了正确的结果,但将来我想添加类似击键的事件,它不会停止ping,而是返回初始设置菜单(脚本中的问题列表)要添加或删除某些IP。建议我执行以下操作,请参阅下一条消息。建议哪个是givven:一般来说,您的设计应该使用调度程序和队列。调度程序用任务填充队列。每个线程正在队列中等待某个任务。当线程获得某个任务时,它将执行该任务并将值返回给dispatcher。这样,所有内容都是相互独立的。单个线程的速度和速度没有区别。它以自己的速度运行,独立于任何其他线程。非常感谢,我将很快对它进行测试。我收到了以下建议,但我不明白应该是什么代码,你能建议吗?建议:你的设计应该是我们的e一个调度程序和一个队列。调度程序用任务填充队列。每个线程都在等待队列中的某个内容。当线程得到某个内容时,它执行任务并将值返回给调度程序。这样,所有内容都是相互独立的。单个线程的速度和速度没有区别。它自行运行速度,独立于任何其他线程。@ArtiomKozyrev我的建议仍然是不要使用线程!你的线程不会做任何事情,它们大部分都是空闲的,并且一直在等待ping命令的输出,所以为什么要浪费这么多的资源而只是在多个战线上等待呢?非常感谢,我在编程方面缺乏经验,所以要问一些奇怪的问题应该多线程是唯一的选择。我将阅读有关子进程的内容并尝试实现它。非常感谢,我将很快对它进行测试。我得到了以下建议,但我不明白应该是什么代码,你能建议吗?建议:你的设计应该使用一个调度程序和一个队列。调度程序用任务填充队列。每个线程都是等待队列中的某个线程。当一个线程得到某个线程时,它执行任务并将值返回给调度程序。这样,所有任务都是相互独立的。单个线程的速度或慢与否无关。它以自己的速度运行,与任何其他线程无关。@ArtiomKozyrev我的建议仍然是不要使用threads!你的线程将什么都不做,它们大部分都是空闲的,并且一直在等待ping命令的输出,那么为什么要浪费这么多资源来保持多条战线上的等待呢