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 相关文章推荐
使用IPython来操作Docker容器的入门指引
Apr 08 Python
十个Python程序员易犯的错误
Dec 15 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
Python Django框架模板渲染功能示例
Nov 08 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
Python基础类继承重写实现原理解析
Apr 03 Python
python中pyplot基础图标函数整理
Nov 10 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 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
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
详解PHP PDO简单教程
2019/05/28 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
javascript几个易错点记录
2014/11/26 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
python实现的简单抽奖系统实例
2015/05/22 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
Python 解析xml文件的示例
2020/09/29 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
越南综合购物网站:Lazada越南
2019/06/10 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
花卉与景观设计系大学生求职信
2013/10/01 职场文书
创业融资计划书
2014/04/25 职场文书
绿里奇迹观后感
2015/06/15 职场文书