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

时间:2018-09-03 17:08:31

标签: python multithreading

我想制作控制台程序来ping远程IP。我使用多线程同时对多个IP执行ping操作。当所有IP都可以访问时,看起来都很不错,但是当一个IP不能访问时,由于连接方法,其他线程不得不等待很长时间才能完成不良的ping操作(我故意选择了一个不可ping的IP),因为该方法要等到所有线程结束了。当我刚删除加入方法时,我的电脑崩溃了。

我做了以下事情来克服这个问题(创建了无限ping函数,因此无法使用inad来终止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))

无限次ping一次IP地址:

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()

1 个答案:

答案 0 :(得分:1)

您不需要线程来执行多个进程-只需使用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