Как исправить поток, полностью останавливая другие темы без ошибок - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь запустить побочный поток для сбора данных из 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

Ожидаемые результаты должны быть 3-го потока, работающего в то же время, что и поток 1, и проходящего назад и вперед между потоком 2 и потоком 3 с блокировкой.запись данных в файл журнала и на экран.

1 Ответ

0 голосов
/ 04 апреля 2019

Я вижу ряд проблем:

  • самый важный, когда вы создаете экземпляр Thread, вы делаете это неправильно, потому что вы звоните Thread(target=threadfunction()) вместо Thread(target=threadfunction) с дополнительным (), что в основном означает, что вы звоните threadfunction и даете цели Thread результат вызова threadfunction, который в основном равен None. Теперь я понимаю, что вы хотите передать некоторые аргументы потоку при его создании, но вам нужно передать их через параметр args конструктора Thread. больше информации об аргументах Thread здесь .
  • это также причина, по которой ваш код застрял на switch.vlan_100.get(), потому что вы вызываете функцию output перед тем, как добавлять элементы в self.vlan_101 позже в sort_by_vlan, и поведение Queue по умолчанию - ждать get, пока он не получит в него какие-то предметы. -> будьте осторожны, как будто вы не проверяете, пуста ли очередь, вы можете снова застрять, даже если исправите эти плохие вызовы
  • вы создаете thread_alert несколько раз. В некотором смысле это его назначение, вы должны использовать очередь между основным потоком коммутатора и thread_alert и просто передавать ей пакеты
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...