基于event 实现的线程安全的优先队列(python实现)
event 事件是个很不错的线程同步,以及线程通信的机制,在python的许多源代码中都基于event实现了很多的线程安全,支持并发,线程通信的库
对于优先队列的堆实现,请看《python下实现二叉堆以及堆排序》, python的event请看<python lock, semaphore, event实现线程同步>, 其实主要注意event几个方法的用法, 以及多线程访问下的程序的逻辑顺序, 在相关代码段放好event的几个方法就好了。自己去理解下, 不难。看下源码吧:
import heapq import threading # import timeclass Item:def __init__(self, name):self.name = namedef __repr__(self):return 'Item({!r})'.format(self.name)class PriorityQueue:def __init__(self):self._queue = []self._index = 0self._event = threading.Event()def push(self, item, priority):if len(self._queue) != 0:self._event.clear()while not self._event.is_set():self._event.set()heapq.heappush(self._queue, (-priority, self._index, item)) # 存入一个三元组, 默认构造的是小顶堆self._index += 1# self._event.set()def pop(self):if len(self._queue) != 0:self._event.set()while self._event.is_set():self._event.wait()x = heapq.heappop(self._queue)[-1] # 逆序输出 self._event.clear()return xdef test1(p, item, index):for i in range(3):p.push(Item(item), index)def test2(p):for i in range(3):print(p.pop())if __name__ == '__main__':p = PriorityQueue()t1 = threading.Thread(target=test1, args=(p, 'foo', 1))t3 = threading.Thread(target=test1, args=(p, 'bar', 2))t4 = threading.Thread(target=test1, args=(p, 'Ryan', 28))t2 = threading.Thread(target=test2, args=(p,))t5 = threading.Thread(target=test2, args=(p,))t6 = threading.Thread(target=test2, args=(p,))t1.start()t2.start()t1.join()t2.join()t3.start()t5.start()t3.join()t5.join()t4.start()t6.start()t4.join()t6.join()
建议去看看python的socket源码以及queue.py等源码这些涉及到了多线程访问的库都是基于这些线程同步机制实现的, 你可以仿写下, 毕竟人家写的更专业.
转载于:https://www.cnblogs.com/zhiyong-ITNote/p/7629010.html
基于event 实现的线程安全的优先队列(python实现)相关推荐
- 安全云盘项目(二):2.1 基于libevent的C++线程池
注意:基于libevent的C++线程池主要参数memcached 下图是具体的技术栈 项目功能: 1.实现ftp服务器,在linux种和windows种都可以运行 2.实现ftp的基本功能 (1)匿 ...
- python queue死锁_Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue...
一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...
- 连傻瓜都能看懂的基于代码注入的线程守护技术
连傻瓜都能看懂的基于代码注入的线程守护技术 2010年08月31日 连傻瓜都能看懂的基于代码注入的线程守护技术 Author: 叶紫孤(CPP肥兔) (感谢冷风大哥提供技术支持) E-mail: ye ...
- 【C++学习】 基于Linux/C++简单线程池的实现
[C++学习] 基于Linux/C++简单线程池的实现 转载自:https://www.cnblogs.com/alwayswangzi/p/7138154.html 我们知道Java语言对于多线程的 ...
- Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程
目录 一.Python 线程池前言 二.Python 线程池 ThreadPoolExecutor 常用函数 1.线程池 as_completed 函数使用 2.线程池 map 函数使用 3.线程池 ...
- Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程
目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...
- Python 线程队列 LifoQueue – LIFO - Python零基础入门教程
目录 一.Python 线程队列 Queue 分类 二.Python 线程先进后出队列 LifoQueue 简介 三.Python 线程先进后出队列 LifoQueue 函数介绍 四.Python 线 ...
- Python 线程队列 Queue – FIFO - Python零基础入门教程
目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...
- Python 线程障碍对象 Barrier - Python零基础入门教程
目录 一.Python 线程障碍对象 Barrier 简介 二.Python 线程障碍对象 Barrier 原理 三.Python 线程障碍对象 Barrier 函数介绍 四.Python 线程障碍对 ...
最新文章
- android 手机监听屏幕锁屏,用户解锁
- 终端证书文件批量导入数据库的Python源码
- Python 基础篇-whl文件怎么安装
- tuxedo连接mysql_TUXEDO与INFORMIX数据库的互连
- 判别测试字段怎么算它的位数_心理测试 | 成人依恋量表-亲密关系经历量表ECR...
- overflow妙用--去除默认滚动条,内容仍可滚动
- 借助 Cloud Toolkit 快速创建 Dubbo 工程
- leetcode23-合并K个升序链表
- 学校计算机教室局域网的建立,校园局域网组建及配置.pdf
- linux系统重启方式,查看linux系统重启的命令和方式
- greenev —— Python 异步网络服务框架
- Windows10内存泄漏,分页池高分析及解决方案
- ftp工具哪个好,推荐8个超级好用而且免费的ftp工具,支持中文版windows系统的。
- TeX 主题选讲:TeX 处理器的结构(转)
- html中siblings方法,jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例...
- 乐鑫ESP32-C3开发(一)简述和目录
- 韦东山70天驱动笔记(1)
- 程序员的算法趣题Q68: 异性相邻的座位安排(1)
- 页面跳转问题presentViewController
- 关于MATLAB对已有数据的频谱分析及关心频率的幅值计算
热门文章
- 限定位宽比较大小_自己之前买电脑整理的一些电脑知识,比较粗糙,仅供参考。...
- html渲染json的插件,[ json editor] 如何在网页中使用Json editor 插件
- springboot记录用户访问次数_SpringBoot中自定义注解实现控制器访问次数限制示例...
- java 搜索起始位置,从Java中的给定位置搜索字符
- reduce 数据倾斜_Spark(四十)数据倾斜解决方案之将reduce join转换
- 海豚计算机语言,海豚模拟器 V5.0 多国语言安装版
- java接收post文件_java – 如何发送POST请求并获取文件响应?
- python执行变量次_当脚本再次执行时需要一个变量来保留它的值(Python)
- jetty java 文件下载_Jetty 嵌入式开发之文件浏览和文件下载
- javascript Node对象