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

如何在Python Websockets中为每个新客户端创建独立线程?

实现每个客户端独立线程处理的方案

首先说明:Python的websockets库本身基于asyncio异步模型,每个客户端连接会自动在事件循环中以协程的方式独立处理,这种模型已经能高效应对大量并发连接,通常不需要额外创建线程。但如果确实需要给每个客户端分配独立线程,可按以下方式实现:

修正后的代码实现

import asyncio
import websockets
import threading

total_clients = 0

def client_thread_handler(websocket):
    """在独立线程中处理单个客户端的收发逻辑"""
    global total_clients
    try:
        # 在线程内创建新的事件循环
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)

        async def handle_client():
            while True:
                msg = await websocket.recv()
                print(f"Client [{threading.get_ident()}] : {msg}")
                response = input("Server : ")
                await websocket.send(response)

        loop.run_until_complete(handle_client())
    except websockets.exceptions.ConnectionClosed:
        print(f"Client [{threading.get_ident()}] disconnected")
    finally:
        total_clients -= 1
        print(f"Total clients: {total_clients}")
        loop.close()

async def server_handle(websocket, path):
    """新客户端连接时触发,创建独立线程处理该客户端"""
    global total_clients
    total_clients += 1
    print(f"New client connected. Total clients: {total_clients}")
    
    # 创建并启动线程处理当前客户端
    client_thread = threading.Thread(target=client_thread_handler, args=(websocket,), daemon=True)
    client_thread.start()

def start_server():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    start_server_coro = websockets.serve(server_handle, "localhost", 1234)
    loop.run_until_complete(start_server_coro)
    print("Server started on ws://localhost:1234")
    loop.run_forever()

if __name__ == "__main__":
    # 启动服务器线程
    server_thread = threading.Thread(target=start_server, daemon=True)
    server_thread.start()
    
    # 保持主线程运行
    try:
        while True:
            input()
    except KeyboardInterrupt:
        print("Server shutting down")

关键说明

  • 新客户端连接时,server_handle协程会触发,此时创建独立线程并将当前客户端的websocket对象传入线程处理函数。
  • 每个线程内创建独立的asyncio事件循环,用于运行该客户端的收发逻辑,避免线程间的事件循环冲突。
  • 使用daemon=True标记线程,确保主线程退出时所有客户端线程也会终止。
  • 修复了原代码中客户端计数错误的问题,现在会在客户端连接/断开时正确更新计数。

注意事项

  • 这种方式会增加系统资源开销,因为每个线程都有独立的栈空间和事件循环,不适用于高并发场景。
  • 如果没有特殊的同步需求(比如调用阻塞式第三方库),优先使用websockets原生的异步协程模型,性能和资源利用率更高。

内容的提问来源于stack exchange,提问作者vishnu_data_science

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:25:44