Я запускаю простой сервер эхо-сокетов, и всякий раз, когда подключается клиент, ctrl C не выходит/завершает работу сервера. Вместо этого он «зависает» до тех пор, пока клиент не отключится от сокета. Я где-то читал, что это связано с тем, что поток остается живым даже после того, как основной поток был завершен. Как решить эту проблему?
Код Python (извините за некоторые отступы, он плохо скопировал и вставил):
import SocketServer
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
import sys
import time
import socket
import os
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
pass
class RequestHandler(StreamRequestHandler):
def handle(self):
print str(self.client_address) + 'connected'
data = "foo"
while data != "":
try:
data = self.rfile.readline().rstrip('\n')
except:
self.request.close()
print 'Socket Error'
break
print data
try:
self.wfile.write("OK\n")
except socket.error:
data = ""
print 'Handler Exiting'
self.request.close()
def finish(self):
print 'Client ' + str(self.client_address) + ' Disconnected'
if __name__ == '__main__':
PORT = 80
print 'Starting Server on port: ' + str(PORT)
ThreadingTCPServer.allow_reuse_address = True
server = ThreadingTCPServer(("", PORT), RequestHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
print "\nServer Terminated"
server.shutdown()
sys.exit()
Все ответы приветствуются, спасибо за ваше время!
shutdown()
из того же потока, что иserve_forever()
... это потому, чтоshudown()
устанавливает флаг, который используетserver_forever()
. Посмотрите на код, понять несложно github.com/python/ cpython/blob/3.9/Lib/socketserver.py Решение состоит в том, чтобы запуститьserve_forever()
в отдельном потоке, и тогда будет работатьshutdown()
. - person Eric   schedule 31.07.2021