Python SocketServer多线程同步实现指南

温以宁
温以宁
发布时间:2026-10-13| 3人浏览过
原创

本文详解Python中SocketServer实现多线程同步的方法。通过引入threading.Lock()全局锁与Queue队列,确保多客户端并发访问时数据处理的原子性。代码演示了如何创建自定义线程类,在获取连接数据后加锁处理,完成后释放锁,有效避免资源竞争,适用于需要共享数据处理的网络服务场景。

本文主要探讨在Python编程中,利用SocketServer模块实现多线程同步的具体方案。

在开发过程中,核心需求是实现互斥访问,确保同一时刻仅有一个客户端能够使用共享数据。

尽管使用Python编写简单的网络程序相对便捷,但对于逻辑复杂的网络应用,采用现成的框架更为适宜。这有助于开发者专注于业务逻辑,而非纠缠于套接字的底层细节。SocketServer模块正是为此简化了网络服务程序的编写任务,它也是Python标准库中众多服务器框架的基础组件。

网络服务类概述:

SocketServer模块提供了四种基础的服务类:

TCPServer用于处理基于TCP协议的套接字流; UDPServer用于处理基于UDP协议的数据报套接字; UnixStreamServer和UnixDatagramServer则针对UNIX域套接字,在实际应用中相对少见。

首先需要明确一点:在SocketServer架构中,每当有客户端成功建立连接,系统都会为该客户端创建一个独立的线程。

为了实现这些多线程之间的同步执行,采取的策略是:额外创建一个自定义线程类,该类中封装项目所需的具体业务逻辑。当某个客户端试图调用该线程时,先对当前线程加锁,待业务逻辑运行完毕后再释放锁。

欢迎指正与交流。

具体实现步骤请参见代码注释:

#coding=gbk
__author__ = 'kaikai'

import Queue
import threading
import time
import SocketServer

#全局线程锁
threadLock = threading.Lock()#全局数据队列
data = Queue.Queue()
#工作线程类,
class testThead(threading.Thread):
  global data
 def __init__(self):
    threading.Thread.__init__(self)

  def begin_test(self):
    self.start()

  def run(self):
    global threadLock
    
    threadLock.acquire()

    # 从队列中取出连接和数据
    if data.qsize()>0:
      this_receive = data.get()
    else:
      print "data size is empty !"
      return

    # 解析数据,获得连接和数据
    # 使用当前数据的conn
    this_conn = this_receive.keys()[0]
    this_data = this_receive[this_conn]

    # 释放锁
    threadLock.release()

  def send_msg(self,conn,msg):
    try:
      conn.sendall(msg)
    except Exception as e:
      print "send " + str(msg) +"fail !!!!!!!!!!!!!!"

  def recv_msg(self,conn):
    try:
      recv_msg = conn.recv(2048)
      return recv_msg
    except Exception as e:

      print " recv msg fail !!!!!!!!!!"
      return None

# 每有一个客户端生成一个线程。所有线程调用同一个测试线程,如果测试线程在锁定中,则进入等待。
class MyServer(SocketServer.BaseRequestHandler):

  def send_msg(self,conn,msg):
    try:
      conn.sendall(msg)
    except Exception as e:
      print "send " + str(msg) +"fail !!!!!!!!!!!!!!"
  def recv_msg(self,conn):
    try:
      recv_msg = conn.recv(2048)
      return recv_msg
    except Exception as e:

      print " recv msg fail !!!!!!!!!!"

  def handle(self):
    global data
    # 获得连接
    conn = self.request

    print "client connect!"

    # 循环接受客户端数据
    while True:
      # 接受客户端发送过来的参数
      receive_data = self.recv_msg(conn)

      print receive_data
      # 如果参数为空,返回报错 结束循环
      if not receive_data:
        print "can not get data form client ! "
        break

      print "data size put before: " + str(data.qsize())
      # 将连接和数据添加到队列中 放入连接可以保证在另一个线程中直接使用连接给相应客户端发送或者接受数据。同时保证数据与客户端的一一对应
      data.put({conn:receive_data})

      print "data size put aftter: " + str(data.qsize())
      # 初始化测试线程
      testThead_this = testThead()
      # 开始测试线程
      testThead_this.begin_test()
      # testThead_this.start()
      # 等待测试线程执行结束
      testThead_this.join()

      print "this test end "

if __name__ == "__main__" :
  try:
    server = SocketServer.ThreadingTCPServer(('192.168.100.100',56780),MyServer)
    server.timeout = 100
    print "Server run success !!!! "

    server.serve_forever()

  except Exception as e:
    print "Server run failed !!!!\n  error: " + str(e)

总结

以上即为本文关于Python SocketServer实现多线程同步的完整实例代码,希望能为读者提供帮助。感兴趣的朋友可继续查阅本站其他相关专题,如有疏漏之处,欢迎留言指正。感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。