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批量生成本地ip地址的方法
Mar 23 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
python为QT程序添加图标的方法详解
Mar 09 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
python 如何区分return和yield
Sep 22 Python
教你用python实现一个无界面的小型图书管理系统
May 21 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
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
2020/03/18 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
IE8 浏览器Cookie的处理
2009/01/31 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
Python自动生产表情包
2017/03/17 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
html5 视频播放解决方案
2016/11/06 HTML / CSS
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
本科生学习总结的自我评价
2013/10/02 职场文书
小学教师事迹材料
2014/01/13 职场文书
护士在校生自荐信
2014/02/01 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
安全生产标语
2014/06/06 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers