Python编程scoketServer实现多线程同步实例代码

yipeiwu_com5年前Python基础

本文研究的主要是Python编程scoketServer实现多线程同步的相关内容,具体介绍如下。

开发过程中,为了实现不同的客户端同一时刻只能有一个使用共同数据。

虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。

网络服务类:

SocketServer提供了4个基本的服务类:

TCPServer针对TCP套接字流
UDPServer针对UDP数据报套接字
UnixStreamServer和UnixDatagramServer针对UNIX域套接字,不常用。

首先,明确一点,在scoketServer中,每当有一个客户端连接成功后都会为每个客户端创建一个线程。

为了让这些多线程之间能够同步执行,我的做法是:再创建一个线程类,这个线程类中做一些我的项目需要做的事情,,当某个客户端想成使用到这个线程时,给当前线程加锁,运行完成后释放锁。

请指教

详细步骤请看注释:

#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编程scoketServer实现多线程同步实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

Django 实现admin后台显示图片缩略图的例子

直接上代码 定义一个upload_img来返回显示图片的html 定义显示图片说明和allow_tags mark_safe方法于django.utils.safestring导入...

pandas求两个表格不相交的集合方法

pandas求两个表格不相交的集合方法

Hi,好久不见,我还是那颗翻滚的老鼠屎。处理数据时想求两个表格求不相交的部分,或许是对知识的匮乏限制了我的想象力,并未找到直接求的方法,在这里介绍老鼠屎技己使用的方法,希望对读者会有帮助...

Python内置函数dir详解

1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码 代码如下: >>> help(dir) Help on built-in...

pytorch三层全连接层实现手写字母识别方式

pytorch三层全连接层实现手写字母识别方式

先用最简单的三层全连接神经网络,然后添加激活层查看实验结果,最后加上批标准化验证是否有效 首先根据已有的模板定义网络结构SimpleNet,命名为net.py import torc...

将python安装信息加入注册表的示例

背景 重装系统,发现之前装在E盘的python可以直接使用,就只是将python的安装目录加入到环境变量中,也一直没有管它,今天跟天软交互的时候发现一直不成功,猜测可能是没有注册表信息。...