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中as用法实例分析
Apr 30 Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
python基础教程之Filter使用方法
Jan 17 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
Random 在 Python 中的使用方法
Aug 09 Python
python logging日志模块原理及操作解析
Oct 12 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
python如何实现图片压缩
Sep 11 Python
Python基本知识点总结
Apr 07 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中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
Python日志器使用方法及原理解析
2020/09/27 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
一些.net面试题
2014/10/06 面试题
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
毕业生文员求职信
2013/11/03 职场文书
自动化职业生涯规划书范文
2014/01/03 职场文书
社会调查研究计划书
2014/05/01 职场文书
实习公司领导推荐函
2014/05/21 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
条幅标语大全
2014/06/20 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
教师节寄语2015
2015/03/23 职场文书
停电放假通知
2015/04/14 职场文书
高中同学会致辞
2015/08/01 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
vue实现拖拽交换位置
2022/04/07 Vue.js