如何修复线程完全停止其他线程没有错误

问题描述 投票:0回答:1

我试图运行一个侧线程从第一个线程收集数据,但是,侧线程“线程3”完全停止所有功能。我以为线程应该同时运行?我需要帮助来理解发生了什么。

我已经尝试完全删除线程3的创建并且允许再次完成功能,但是一旦我读取它即使启动功能在其他功能之后,它仍然继续停止一切。

from threading import Thread, Lock, Semaphore
import datetime
from packet_reader import Rip
import time

# queue.PriorityQueue.
global switch


class NewThread(Thread):

    def __init__(self):
        Thread.__init__(self, name="My First Thread")

    def run(self):
        now = datetime.datetime.now()
        print("This is: {0} at {1}".format(self.getName(), now))


class Switch:
    def __init__(self):
        self.vlan_100_0 = queue.Queue()
        self.vlan_100 = queue.Queue()
        self.vlan_101_0 = queue.Queue()
        self.vlan_101 = queue.Queue()

    def sort_by_vlan(self, f):
        with open("log", "w") as log:
            thread_output = Thread(target=output(log), name="Sort Thread")  # Thread 3 creation
            for line in f:
                if Rip().get_vlan_id(line) == 100:
                    if Rip().get_priority(line) == 0:
                        self.vlan_100_0.put(line)
                    elif Rip().get_priority(line) == 2:
                        temp_packetobject = Rip()
                        thread_alert = Thread(target=alert(line, temp_packetobject, log), name="Sort Thread")
                        thread_alert.start()
                        self.vlan_100.put(line)
                    # send message to interuppt handler

                elif Rip().get_vlan_id(line) == 101:
                    if Rip().get_priority(line) == 0:
                        self.vlan_101_0.put(line)
                    elif Rip().get_priority(line) == 2:
                        temp_packetobject = Rip()
                        thread_alert = Thread(target=alert(line, temp_packetobject, log), name="Sort Thread")
                        thread_alert.start()
                        self.vlan_101.put(line)
                    # Send message to interrupt handler

        while self.vlan_100_0.empty() is False:
            self.vlan_100.put(self.vlan_100_0.get())

        while self.vlan_101_0.empty() is False:
            self.vlan_101.put(self.vlan_101_0.get())

        thread_output.start()
        del self.vlan_100_0
        del self.vlan_101_0
        return


lock = Lock()  # Creating the Threading lock


def startx():  # Thread 1

    with open("file", "r") as f:
        switch.sort_by_vlan(f)
    # print(x) Used for debugging


def alert(packet, packetobject, log):  # Thread 2

    packetinfo = packetobject.get_src_mac(packet) + " " + packetobject.get_dest_mac(packet) + " TIME:" + str(datetime.datetime.now())

    with lock:
        print("Obtained lock for alert")
        log.write("ALERT -- PRIORITY PACKET --- " + packet + " --- " + packetinfo + "\n\n")
        print("ALERT -- PRIORITY PACKET --- " + packet + " --- " + packetinfo + "\n\n")


def output(log):  # Thread 3
    print("got to log")
    with lock:
        print("Obtained lock for output")
        packet = switch.vlan_100.get()  # This line stops everything for some reason
        log.write("QUEUED PACKET --- " + packet) + " --- " + Rip().get_src_mac(packet) + " " + Rip().get_dest_mac(packet) + " TIME:" + str(datetime.datetime.now() + "\n\n")
        print("QUEUED PACKET --- " + packet + " --- " + Rip().get_src_mac(packet) + " " + Rip().get_dest_mac(packet) + " TIME:" + str(datetime.datetime.now() + "\n\n"))


switch = Switch()
thread_sort = Thread(target=startx, name="Sort Thread")  # Thread 1 creation
thread_sort.start()


# nice

预期结果应该是与线程1同时运行的第3个线程,并且在线程2和线程3之间来回进行锁定。将数据写入日志文件和屏幕。

python multithreading queue
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.