socketserver にはshutdown()
サーバーをシャットダウンするメソッドがあることは知っていますが、シャットダウンは実行中のスレッドとは異なるスレッドから呼び出す必要があるため、これは複数のスレッドアプリケーションでのみ機能しますserve_forever()
。
私のアプリケーションは一度に 1 つのリクエストしか処理しないので、リクエストの処理に個別のスレッドを使用せず、shutdown()
デッドロックが発生するため呼び出すことができません (ドキュメントにはありませんが、socketserver のソース コードに直接記載されています)。
理解を深めるために、コードの簡略版をここに貼り付けます。
import socketserver
class TCPServerV4(socketserver.TCPServer):
address_family = socket.AF_INET
allow_reuse_address = True
class TCPHandler(socketserver.BaseRequestHandler):
def handle(self):
try:
data = self.request.recv(4096)
except KeyboardInterrupt:
server.shutdown()
server = TCPServerV4((host, port), TCPHandler)
server.server_forever()
このコードが機能していないことは承知しています。ユーザーがCtrlC.