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编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
Tornado实现多进程/多线程的HTTP服务详解
Jul 25 Python
Django Admin后台添加数据库视图过程解析
Apr 01 Python
Python中实现输入一个整数的案例
May 03 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
用python对oracle进行简单性能测试
Dec 05 Python
python实现马丁策略的实例详解
Jan 15 Python
Python requests用法和django后台处理详解
Mar 19 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
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
python开发一款翻译工具
2020/10/10 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
五年级英语教学反思
2014/01/31 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
施工安全汇报材料
2014/08/17 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
react中的DOM操作实现
2021/06/30 Javascript
详解Python中下划线的5种含义
2021/07/15 Python
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python