Python中如何使用threading实现socket多连接并发处理
问题原因
你的代码只是导入了threading模块、创建了一个完全没被使用的threading.Lock()实例,核心逻辑和单线程版本没有任何区别,自然没法处理多连接,具体问题点:
- 只调用了一次
s.accept():这个方法是阻塞调用,运行一次只会接住一个客户端连接,等第一个连接断开、当前代码块执行完后,程序直接就退出了,根本没有逻辑回到等待连接的状态接收后续连接。 - 没有真正使用多线程:你没有把单个客户端的通信处理逻辑放到子线程中执行,主线程拿到第一个连接后就直接卡在
recv循环里处理这个连接的通信,完全没法回头响应新的接入请求。 - 缺少连接断开判断:
conn.recv(1024)如果返回空值b"",就代表客户端已经关闭连接,原代码没有做这个判断,客户端断开后会无限循环打印空字节。
修正方案
正确的多线程TCP服务端逻辑应该是:主线程无限循环调用accept()等待新连接,每接到一个连接就开一个独立子线程处理这个连接的通信,主线程立刻回到等待状态接收下一个连接。
修正后可正常工作的代码如下:
import socket import threading HOST = "127.0.0.1" PORT = 4999 TIMEOUT = 1 def handle_conn(conn, addr): """单个客户端连接的处理逻辑,运行在独立子线程""" conn.settimeout(TIMEOUT) print(f"Connected by {addr}") with conn: while True: try: received = conn.recv(1024) # recv返回空值代表客户端主动断开连接 if not received: print(f"Connection from {addr} closed") break print(received) except socket.timeout: # 触发超时后跳过,继续等待该连接的新数据 continue with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() print(f"Server listening on {HOST}:{PORT}") # 外层无限循环,持续等待新连接接入 while True: conn, addr = s.accept() # 新连接丢给子线程处理,主线程不阻塞,立刻回到等待状态 client_thread = threading.Thread(target=handle_conn, args=(conn, addr), daemon=True) client_thread.start()
注:线程参数设置
daemon=True是为了主线程退出时所有子线程自动跟随退出,如果需要保证子线程任务处理完再退出,可以移除该参数,自行添加线程等待逻辑即可。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

