我试图运行一个侧线程从第一个线程收集数据,但是,侧线程“线程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之间来回进行锁定。将数据写入日志文件和屏幕。