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

Python Socket多客户端TCP服务端数据累加存储失败问题咨询

存在的问题

  1. 类变量访问逻辑错误
    你将totalNum定义为ServerThread的类变量后,仍通过self.totalNum进行赋值操作,Python会为当前线程实例创建一个同名的实例属性覆盖类变量,后续所有读写操作都针对线程实例私有属性,无法实现全局共享累加。
  2. 无并发安全控制
    多线程场景下多个请求同时修改共享变量时会触发竞态条件,多个线程可能读取到同一个旧值分别累加后写回,最终累加结果会丢失部分增量。

修复后的服务端代码

#!/usr/bin/python3
import socket
import threading

class ServerThread(threading.Thread):
    totalNum = 0
    # 新增线程锁,用于控制共享变量并发访问
    modify_lock = threading.Lock()
    def __init__(self, client):
        threading.Thread.__init__(self)
        self.client = client

    def run(self):
        connectionSocket, addr = self.client   
        number = connectionSocket.recv(1024)
        newNumber = number.decode()
        newNumber = int(newNumber)
        editedNumber = newNumber + 1
        # 修改共享变量时加锁
        with self.modify_lock:
            # 直接通过类名访问类变量,避免创建实例属性
            ServerThread.totalNum = editedNumber + ServerThread.totalNum
            print(ServerThread.totalNum)
        editedNumber = str(editedNumber)
        connectionSocket.send(editedNumber.encode())
        connectionSocket.close()

class ServerMain:
    def server_run(self):  
        serverPort = 12000
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serverSocket.bind(("", serverPort))
        serverSocket.listen(5)
        print("The server is ready to receive")
        while True:
            client = serverSocket.accept()
            t = ServerThread(client)
            t.start()

if __name__ == '__main__':
    server = ServerMain()
    server.server_run()

效果验证

  • 客户端A输入5发送,服务端打印6,返回6给客户端A
  • 后续客户端B输入8发送,服务端打印15,返回9给客户端B,符合预期的累加逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:06