我想制作控制台程序来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()
答案 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