You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:36:24