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程序中操作MySQL的基本方法
Jul 29 Python
Python3.6正式版新特性预览
Dec 15 Python
Python subprocess模块详细解读
Jan 29 Python
Atom的python插件和常用插件说明
Jul 08 Python
python 实现一次性在文件中写入多行的方法
Jan 28 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
详解Python3 pandas.merge用法
Sep 05 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
Python 可视化神器Plotly详解
Dec 26 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 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下实现农历日历的代码
2007/03/07 PHP
php Smarty模板生成html文档的方法
2010/04/12 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
javascript 函数式编程
2007/08/16 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
跟老齐学Python之用while来循环
2014/10/02 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
python3字符串输出常见面试题总结
2020/12/01 Python
J2EE是技术还是平台还是框架
2016/08/14 面试题
《夸父追日》教学反思
2014/02/26 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
知识竞赛主持词
2014/03/26 职场文书
文秘求职信范文
2014/04/10 职场文书
社团活动总结
2014/04/28 职场文书
小学见习报告
2014/10/31 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
小学见习报告
2015/06/23 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫