Python中的多线程Pinger

时间:2019-06-06 20:29:18

标签: python multithreading icmp

我正在尝试使用线程和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保持不变

0 个答案:

没有答案