python socketserver shutdown问题

使用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()
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃肉夹馍不要夹馍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值