Python编程scoketServer实现多线程同步实例代码
Python  /  管理员 发布于 7年前   206
本文研究的主要是Python编程scoketServer实现多线程同步的相关内容,具体介绍如下。
开发过程中,为了实现不同的客户端同一时刻只能有一个使用共同数据。
虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。
网络服务类:
SocketServer提供了4个基本的服务类:
TCPServer针对TCP套接字流
UDPServer针对UDP数据报套接字
UnixStreamServer和UnixDatagramServer针对UNIX域套接字,不常用。
首先,明确一点,在scoketServer中,每当有一个客户端连接成功后都会为每个客户端创建一个线程。
为了让这些多线程之间能够同步执行,我的做法是:再创建一个线程类,这个线程类中做一些我的项目需要做的事情,,当某个客户端想成使用到这个线程时,给当前线程加锁,运行完成后释放锁。
请指教
详细步骤请看注释:
#coding=gbk__author__ = 'kaikai'import Queueimport threadingimport timeimport 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实现多线程同步实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号