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高效编程技巧
Jan 07 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 Python
python相对企业语言优势在哪
Jun 12 Python
Java byte数组操纵方式代码实例解析
Jul 22 Python
python 绘制国旗的示例
Sep 27 Python
Python类方法总结讲解
Jul 26 Python
python之django路由和视图案例教程
Jul 26 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
天津市收音机工业发展史
2021/03/04 无线电
php 生成WML页面方法详解
2009/08/09 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
深入理解vue Render函数
2017/07/19 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
python中函数默认值使用注意点详解
2016/06/01 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
python re模块和正则表达式
2021/03/24 Python
车间工艺员岗位职责
2013/12/09 职场文书
大学校园生活自我鉴定
2014/01/13 职场文书
鲜花方阵解说词
2014/02/13 职场文书
社区交通安全实施方案
2014/03/22 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
python ansible自动化运维工具执行流程
2021/06/24 Python
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL