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检测手机QQ在线状态的脚本代码
Feb 10 Python
Python实现二叉搜索树
Feb 03 Python
python脚本设置系统时间的两种方法
Feb 21 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
Python 修改列表中的元素方法
Jun 26 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
python如何查看安装了的模块
Jun 23 Python
PyCharm配置anaconda环境的步骤详解
Jul 31 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
python+opencv实现视频抽帧示例代码
Jun 11 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的ASP防火墙
2006/10/09 PHP
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
详解Document.Cookie
2015/12/25 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
python属于解释语言吗
2020/06/11 Python
Python类super()及私有属性原理解析
2020/06/15 Python
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
经贸韩语专业大学生职业规划
2014/02/14 职场文书
2014年元旦活动方案
2014/02/15 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python