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