使用python的socketserver为客户端实现一个简单的socket server服务进行通信
socketserver服务独立于客户端进程,但是需要在客户端关闭时后也通知关闭socket server进程
之前项目是使用 close发现该socketserver服务依然存活
查阅了socketserver源码和网上资料 包括 stackoverflow问题 , socketserver官方文档
实际上人家在源码注释里说明了:
def shutdown(self):
"""Stops the serve_forever loop.
Blocks until the loop has finished. This must be called while
serve_forever() is running in another thread, or it will
deadlock.
"""
self.__shutdown_request = True
self.__is_shut_down.wait()
也就是说,如果需要关闭socketserver服务,**需要在与serve_forever运行线程不同的另一个线程调用shutdown()**才行,否则会死锁。
于是在我的处理handler里面增加finish逻辑:
from threading import Thread
import socketserver
class MyHandler(socketserver.BaseRequestHandler):
_is_shutdown = False
def handle(self) -> None:
# costum的处理逻辑
if special condition:
# 需要关闭server的信号 将_is_shutdown 置为True,然后再finish方法中通过另一个线程执行server的shutdown方法
self._is_shutdown=True
def finish(self) -> None:
def server_shutdown(server):
server.shutdown()
if self._is_shutdown:
# 关闭server循环
# BaseRequestHandler 中会将server作为其一个参数
shutdown_thread = Thread(target=server_shutdown, args=(self.server, ))
# 为避免死锁,需要新起一个线程执行server.shutdown
shutdown_thread.start()