Я программирую сервер на python и имею несколько потоков, выполняющих разные задачи одновременно.Я пытался обрабатывать потоки всякий раз, когда происходит прерывание клавиатуры.
Вот код для центрального потока:
import shutdownManager as SM
import initManager as IM
import nodeListManager as NLM
import threading
print("<Server Started>")
SM.bootup()
INITTRACKER_THREAD = threading.Thread(target = IM.nodeInitTracker)
NODELISTCLEANER_THREAD = threading.Thread(target = NLM.nodeListCleaner, args = ("NodeList.txt",))
try:
NODELISTCLEANER_THREAD.start()
INITTRACKER_THREAD.start()
NODELISTCLEANER_THREAD.join()
INITTRACKER_THREAD.join()
except KeyboardInterrupt:
print("\n<Shutting Server Down>")
SM.shutdown()
Я посылаю сигналы отключения через файл,и это постоянно проверяется потоком.NODELISTCLEANER_THREAD
работает и выходит именно так, как я хочу.Проблема с другим потоком.
Вот код для другого потока:
import shutdownManager as SM
import socket
def nodeInitTracker():
#Create Socket
s = socket.socket()
#HTTP Port, this forces is you to run with admin/root
port = 80
#Bind and listen for node and client connections
s.bind(('', port))
s.listen(5)
print('<Socket Bounded>: Now Listening')
#Client and Node Management
while True:
#Accept connection
c, addr = s.accept()
print('<CONNECTION ESTABLISHED>: With ', addr[0])
c.send(('1').encode())
if SM.checkShutdown():
print('<Initialization Manager Turned Off>')
c.close()
s.close()
break
#Perform the process that belongs to their respective device type
DeviceType = c.recv(1024).decode()
if DeviceType == 'n':
#Recieve Node Name
NodeName = c.recv(1024).decode()
print('<Node Name Confirmed>: ', NodeName, ' Belongs to ', addr[0])
#Store Node Name in Node List
fNodeList = open('NodeList.txt', 'a')
fNodeList.write(addr[0] + " " + NodeName + "\n")
print("<Recorded Node into Node List>: " + NodeName)
fNodeList.close()
else:
#Receive info from the client
#Please note, that this will be done later. So don't worry about it right now
print('<Client Connections are not implemented yet>')
#Close connection with client or node
c.close()
Это ошибка:
CException игнорируется в:Трассировка (последний вызов был последним): файл "/usr/lib/python3.5/threading.py", строка 1288, в файле _shutdown t.join () "/usr/lib/python3.5/threading.py",строка 1054, в объединенном файле self._wait_for_tstate_lock () "/usr/lib/python3.5/threading.py", строка 1070, в _wait_for_tstate_lock elif lock.acquire (блок, время ожидания): KeyboardInterrupt
Есть ли способ это исправить?