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对IP进行转换的一些操作技巧小结
Nov 09 Python
python实现TF-IDF算法解析
Jan 02 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
python中requests和https使用简单示例
Jan 18 Python
DataFrame中的object转换成float的方法
Apr 10 Python
python3+PyQt5实现柱状图
Apr 24 Python
在双python下设置python3为默认的方法
Oct 31 Python
python3.7简单的爬虫实例详解
Jul 08 Python
python读取指定字节长度的文本方法
Aug 27 Python
python json load json 数据后出现乱序的解决方案
Feb 27 Python
python小程序基于Jupyter实现天气查询的方法
Mar 27 Python
Python tensorflow卷积神经Inception V3网络结构
May 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
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
php生成圆角图片的方法
2015/04/07 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
Python collections模块实例讲解
2014/04/07 Python
python的即时标记项目练习笔记
2014/09/18 Python
python字典的常用操作方法小结
2016/05/16 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
Python模块的加载讲解
2019/01/15 Python
Python-opencv 双线性插值实例
2020/01/17 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
什么是TCP/IP
2014/07/27 面试题
迅雷Cued工作心得体会
2014/01/27 职场文书
作弊检讨书1000字
2014/02/01 职场文书
岗位职责怎么写
2014/03/14 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
故宫的导游词
2015/01/31 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
交通事故被告代理词
2015/05/23 职场文书
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python