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 判断一个进程是否存在
Apr 09 Python
举例讲解Python中is和id的用法
Apr 03 Python
pygame学习笔记(4):声音控制
Apr 15 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
numpy linalg模块的具体使用方法
May 26 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
使用Python实现 学生学籍管理系统
Nov 26 Python
简单了解Python多态与属性运行原理
Jun 15 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
python如何实现递归转非递归
Feb 25 Python
python基础详解之if循环语句
Apr 24 Python
Python音乐爬虫完美绕过反爬
Aug 30 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
DOM XPATH获取img src值的query
2013/09/23 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
js中this对象用法分析
2018/01/05 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
基于python的字节编译详解
2017/09/20 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
用Python解数独的方法示例
2019/10/24 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
几个SQL的面试题
2014/03/08 面试题
市场营销专业毕业生自荐信
2013/11/02 职场文书
业务副厂长岗位职责
2014/01/03 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python