未加星标

Python编程scoketServer实现多线程同步实例代码

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二03 | 时间 | 作者 红领巾 ] 0人收藏点击收藏

本文研究的主要是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实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能Python基于ThreadingTCPServer创建多线程代理的方法示例Python之多线程爬虫抓取网页图片的示例代码Python3多线程爬虫实例讲解代码Python多线程爬虫实战_爬取糗事百科段子的实例Python实现的多线程同步与互斥锁功能示例python获取多线程及子线程的返回值Python实现模拟分割大文件及多线程处理的方法

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

tags: data,msg,线程,conn,print,多线程,self,recv,Python,def,客户端,receive,testThead,SocketServer
分页:12
转载请注明
本文标题:Python编程scoketServer实现多线程同步实例代码
本站链接:http://www.codesec.net/view/572339.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(79)