我正在尝试使用线程和pythonping库从.csv文件同时ping许多IP。问题是,当从线程列表中获取ping()。rtt_avg_ms值时,我在变量中仅获得了初始化的0.0值,该变量应返回以毫秒为单位的平均rtt值
我正在使用的Python解释器的版本是3.6.4项目,它是通过对它们进行ping操作来验证一组服务器是否处于活动状态。我已经设法使用Java来构建此应用程序,但是我也想使用Python来制作它,因为pythonping库似乎运行得很好。
我的解释是在单独的.py文件(PingerThread.py)中创建线程,并使用主程序调用线程列表(PingerMain.py)。理想情况下,我将使用tkinter库构建用于显示数据的界面,但现在我仅使用PrettyTable在控制台上格式化呈现结果。
# Part of code from PingerMain.py
class MyApp():
def __init__(self, root, width, height):
self.root = root
self.table_data = file_contents
self.root.title('Pinger v0.1')
self.root.resizable(False, True)
self.widgets()
self.run = False
self.populate_table()
self.create_threads(len(self.table_data))
self.start_threads()
def pinger_thread(self, threadID, ip, delay):
if exitFlag:
threadID.exit()
threads.append(myThread(threadID, ip, delay))
def create_threads(self, counter):
while counter:
if '\"' in self.table_data[counter-1][0]: break
self.pinger_thread(counter, self.table_data[counter-1][2], 1)
self.table_data[counter-1][3] = threads[len(self.table_data)-counter].get_reached()
counter -= 1
self.print_table(self.table_data)
def start_threads(self):
for x in threads:
x.start()
#--------------------------
# The PingerThread.py file
#--------------------------
import threading
import time
from pythonping import ping
class myThread (threading.Thread):
def __init__(self, threadID, ip, delay):
threading.Thread.__init__(self)
self.threadID = threadID
self.ip = ip
self.delay = delay
self.rtt_avg_ms = 0.0
def run(self):
self.rtt_avg_ms = ping(self.ip, count=1).rtt_avg_ms
time.sleep(self.delay)
def get_reached(self):
return self.rtt_avg_ms
这是控制台上的结果(部分):
+ ---------------------------------- + ----------- --- + ----------------- + ----- + | “ NE名称” | “ NE型” | “ NE IP地址” | | + ---------------------------------- + -------------- + ----------------- + ----- + | “ NE名称” | “ NE型” | “ NE IP地址” | | | NE_no1 | MA5616 | 192.168.1.1 | 0.0 | | NE 2号| MA5611S | 192.168.1.2 | 0.0 | | NE_no3 | MA5616 | 192.168.1.7 | 0.0 | | NE_no4 | MA5611S | 192.168.1.11 | 0.0 | | NE_no5 | MA5616 | 192.168.1.4 | 0.0 | | NE_no6 | MA5616 | 192.168.1.8 | 0.0 |
右侧是self.table_data [counter-1] [3] = threads [len(self.table_data)-counter] .get_reached()返回的0.0值,在上面的代码行中,通过每个线程的get_reached()方法获得的平均ttr值(以毫秒为单位)。每行(前两行除外)应该是运行的单独线程。
我找不到每行仅获得初始值0.0的原因。
编辑: 我发现了为什么上面的代码无法运行。很明显我试图在线程开始运行之前打印表。我更正了代码,并设法使其运行。这是解决方案(尽管需要3秒的延迟才能使线程有时间完成运行)。
# Part of code from PingerMain.py
class MyApp():
def __init__(self, root, width, height):
self.root = root
self.table_data = file_contents
self.root.title('Pinger v0.1')
self.root.resizable(False, True)
self.widgets()
self.run = False
self.populate_table()
self.create_threads(len(self.table_data))
self.start_threads()
time.sleep(3)
self.add_thread_results()
self.print_table(self.table_data)
def pinger_thread(self, threadID, ip, delay):
if exitFlag:
threadID.exit()
threads.append(myThread(threadID, ip, delay))
def create_threads(self, counter):
for x in range(counter):
if x == 0: continue
self.pinger_thread(x-1, self.table_data[x][2], 1)
def start_threads(self):
for x in threads:
x.start()
def add_thread_results(self):
for x in range(len(self.table_data)):
if x == 0: continue
self.table_data[x][3] = threads[x-1].get_reached()
PingerThread.py保持不变