博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python线程安全队列用法
阅读量:7210 次
发布时间:2019-06-29

本文共 1774 字,大约阅读时间需要 5 分钟。

hot3.png

1.今天来利用queue来实现一个线程安全队列。

2.场景:有时我们需要将一个大任务划分成很多小任务,每个小任务执行完得到结果需要放入一个安全队列里面,一个收集结果的线程就实时从队列中取结果将子任务结果聚合,形成大任务计算的结果。

3.代码实现

import queueimport threadingimport time## 封装的安全队列类(十分通用)class SafeQueue(threading.Thread):    # 退出队列的信号    SIG_QUIT = 'sig_quit'    def __init__(self,recv_calback):        threading.Thread.__init__(self)        ## 构造线程安全队列        self.Q = queue.Queue()        self.recv_calback = recv_calback        self.start()    #放入队列    def put(self,datas):        threadName = threading.currentThread().name        self.Q.put(datas)    #关闭队列    def close(self):        self.put(SafeQueue.SIG_QUIT)    ##主循环,处理队列接收    def run(self):        while True:           try:               datas = self.Q.get()               if datas == SafeQueue.SIG_QUIT: #收到退出队列信号                   break                #回调客户端               self.recv_calback(datas)           except: # 抛出打断异常               break##队列回调函数def queue_callback(datas):    print("接收到数据:",datas)    ## 将子任务结果加入 全局集合    try:        array_mutex.acquire()#锁定        datas_array.append(datas)        if len(datas_array) == 4:            safeQueue.close()            print("=======大任务计算结束===========  result:", datas_array)    finally:        array_mutex.release()#释放## 子任务计算函数def calclulate():    threadName = threading.currentThread().name    print(threadName , ' 正在计算')    time.sleep(2)    print(threadName, ' 计算完成,加入队列')    #将结果放入队列    safeQueue.put(threadName+"' result")####  ----------  main start   ----------#创建锁array_mutex = threading.Lock()## 存储 子任务计算结果的 集合datas_array = []##构造安全队列safeQueue = SafeQueue(queue_callback)##开启4 个子任务,开始计算for i in range(1,5):    threading.Thread(target=calclulate).start()

这个SafeQueue模型在项目开发中非常常见,这里有什么封装的不足的谢谢指出。今天队列就到这里,谢谢大家。

转载于:https://my.oschina.net/u/914655/blog/1824240

你可能感兴趣的文章
HGE引擎改进
查看>>
存储过程执行失败与sql668n
查看>>
Android面试题3之描写叙述下Android的系统架构
查看>>
2014-7-20 谁还认得这几本书?
查看>>
基于django搭建网站
查看>>
c++ 循环程序的作业,2017年10月10日作业题。
查看>>
从C语言结构对齐重谈变量存放地址与内存分配
查看>>
NSTimer_Block封装定时器的target-action成Block回调
查看>>
FileInfo类和DirectoryInfo类
查看>>
B. Obtaining the String(模拟)
查看>>
[原]浅谈vue过渡动画,简单易懂
查看>>
10.Vue请求远端数据库
查看>>
js -- sort() 使用排序函数
查看>>
时间你懂的,
查看>>
今天 周日,
查看>>
mysql-5.7.21-winx64安装过程(整了好久原因是没关闭防火墙)
查看>>
vi编辑器
查看>>
《JAVA NIO》第一章 简介
查看>>
有继承关系的对象执行顺序,包括静态变量,静态代码块,普通变量,普通代码块,继承方法....
查看>>
使用ownCloud在Linux安装你的个人云服务
查看>>