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 20 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
Python 的描述符 descriptor详解
Feb 27 Python
横向对比分析Python解析XML的四种方式
Mar 30 Python
遍历python字典几种方法总结(推荐)
Sep 11 Python
django 将model转换为字典的方法示例
Oct 16 Python
pandas通过loc生成新的列方法
Nov 28 Python
Python中按键来获取指定的值
Mar 02 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
 分享一个Python 遇到数据库超好用的模块
Apr 06 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
php下安装配置fckeditor编辑器的方法
2011/03/02 PHP
PHP读取xml方法介绍
2013/01/12 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
使用Python操作MySQL的小技巧
2020/09/10 Python
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
P/Invoke是什么
2015/07/31 面试题
思想品德自我鉴定
2013/10/12 职场文书
竞聘演讲稿范文
2014/01/12 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
小区文明倡议书
2014/05/16 职场文书
战马观后感
2015/06/08 职场文书
导游词之天津古文化街
2019/11/09 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
django上传文件的三种方式
2021/04/29 Python
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript