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 判断自定义对象类型
Mar 21 Python
Python线程的两种编程方式
Apr 14 Python
Python实现在线音乐播放器
Mar 03 Python
Python下调用Linux的Shell命令的方法
Jun 12 Python
对Python使用mfcc的两种方式详解
Jan 09 Python
对Python3 pyc 文件的使用详解
Feb 16 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
简单了解python的内存管理机制
Jul 08 Python
Python 3 判断2个字典相同
Aug 06 Python
python sorted方法和列表使用解析
Nov 18 Python
Django ORM filter() 的运用详解
May 14 Python
python进度条显示之tqmd模块
Aug 22 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定时自动生成静态HTML的实现代码
2010/06/20 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
Javascript 面向对象 命名空间
2010/05/13 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
Python 文件重命名工具代码
2009/07/26 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
香港礼品网站:GiftU eshop
2017/09/01 全球购物
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
市政管理求职信范文
2014/05/07 职场文书
竞选纪律委员演讲稿
2014/09/13 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
个人股份合作协议书
2014/10/24 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
城南旧事电影观后感
2015/06/16 职场文书
单位车辆管理制度
2015/08/05 职场文书
标准发言稿结尾
2019/07/18 职场文书
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python