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


Posted in Python onJanuary 29, 2018

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

Python 相关文章推荐
在Python中用split()方法分割字符串的使用介绍
May 20 Python
Python实现高效求解素数代码实例
Jun 30 Python
Python中异常重试的解决方案详解
May 05 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
pycharm设置注释颜色的方法
May 23 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
pycharm安装和首次使用教程
Aug 27 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
Python模块搜索路径代码详解
Jan 29 #Python
python机器人行走步数问题的解决
Jan 29 #Python
python的socket编程入门
Jan 29 #Python
Python 错误和异常代码详解
Jan 29 #Python
python实现机器人行走效果
Jan 29 #Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 #Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 #Python
You might like
松下Panasonic RF-B65电路分析
2021/03/02 无线电
留言板翻页的实现详解
2006/10/09 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
PHP生成条形图的方法
2014/12/10 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
python基础教程之对象和类的实际运用
2014/08/29 Python
Python多线程和队列操作实例
2015/06/21 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
python写入文件自动换行问题的方法
2019/07/05 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
python 8种必备的gui库
2020/08/27 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
美国糖果店:Sugarfina
2019/02/21 全球购物
Java基础类库面试题
2013/09/04 面试题
干部选拔任用方案
2014/05/26 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书