Python Socket多客户端TCP服务端数据累加存储失败问题咨询
存在的问题
- 类变量访问逻辑错误
你将totalNum定义为ServerThread的类变量后,仍通过self.totalNum进行赋值操作,Python会为当前线程实例创建一个同名的实例属性覆盖类变量,后续所有读写操作都针对线程实例私有属性,无法实现全局共享累加。 - 无并发安全控制
多线程场景下多个请求同时修改共享变量时会触发竞态条件,多个线程可能读取到同一个旧值分别累加后写回,最终累加结果会丢失部分增量。
修复后的服务端代码
#!/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
相关产品推荐
相关产品推荐

