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实现红包裂变算法
Feb 16 Python
详解Python中的静态方法与类成员方法
Feb 28 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
python xpath获取页面注释的方法
Jan 14 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
python实现按首字母分类查找功能
Oct 31 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 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函数
2011/05/31 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
php 数据结构之链表队列
2017/10/17 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
解析jquery获取父窗口的元素
2013/06/26 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Django权限设置及验证方式
2020/05/13 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
5款实用的python 工具推荐
2020/10/13 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
怎样写好自我评价呢?
2014/02/16 职场文书
参观接待方案
2014/03/17 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
python自动计算图像数据集的RGB均值
2021/06/18 Python