"socketserver" 应用在退出时未释放套接字

编程语言 2026-07-11

我在Debian 13系统上用Python3运行下面的程序,以测试 socketserver 包:

#!/usr/bin/env python3                                                                                             

import sys
import socketserver

prog = None
host = '0.0.0.0'
port = 12345

def main():
    with socketserver.TCPServer((host, port), MyTCPHandler) as server:
        server.serve_forever()

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        pieces = [b'']
        total  = 0
        while b'\n' not in pieces[-1] and total < 10_000:
            pieces.append(self.request.recv(2000))
            total += len(pieces[-1])
        self.data = b''.join(pieces)
        print(f"Received from {self.client_address[0]}:")
        print(self.data.decode("utf-8"))
        self.request.sendall(self.data.upper())
        # sys.exit(0)

if __name__ == '__main__':
    sys.exit(main())

程序运行良好,但当我通过Ctrl-C退出该程序时,套接字不会立即释放。我需要等待一段时间,直到该套接字实际关闭。

此外,如果我把 sys.exit(0) 语句取消注释,并且在完成一次请求后退出,套接字也不会立即释放。

想要在退出时让这个程序实际释放套接字,无论退出是由信号引发,还是仅仅通过 sys.exit(0) 退出,应该怎么做?

解决方案

根据Tim Roberts的注释,事实证明,在实例化BaseRequestHandler类之前,需要以下内容:

socketserver.TCPServer.allow_reuse_address = True

我把那条语句作为我的 main() 例程的第一行插入,现在退出后套接字确实会立即消失。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章