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矩阵常见运算操作实例总结
Sep 29 Python
python opencv 图像尺寸变换方法
Apr 02 Python
python实现抖音视频批量下载
Jun 20 Python
python3解析库pyquery的深入讲解
Jun 26 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
Python 中包/模块的 `import` 操作代码
Apr 22 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
python 实现return返回多个值
Nov 19 Python
python代码打印100-999之间的回文数示例
Nov 24 Python
python关于变量名的基础知识点
Mar 03 Python
python中numpy数组与list相互转换实例方法
Jan 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
玩转虚拟域名◎+ .
2006/10/09 PHP
php正则校验用户名介绍
2008/07/19 PHP
php自动加载的两种实现方法
2010/06/21 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
PHP缓存工具XCache安装与使用方法详解
2018/04/09 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
python学习之编写查询ip程序
2016/02/27 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
Python 实现数据结构中的的栈队列
2019/05/16 Python
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
生物科学专业个人求职信范文
2013/12/05 职场文书
自我评价个人范文
2013/12/16 职场文书
工厂会计员职责
2014/02/06 职场文书
购房协议书
2014/04/11 职场文书
文明班级建设方案
2014/05/15 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
司机岗位职责范本
2015/04/10 职场文书
机器人总动员观后感
2015/06/09 职场文书