基于condition 实现的线程安全的优先队列(python实现)
可以把Condiftion理解为一把高级的琐,它提供了比Lock, RLock更高级的功能,允许我们能够控制复杂的线程同步问题。threadiong.Condition在内部维护一个琐对象(默认是RLock),可以在创建Condigtion对象的时候把琐对象作为参数传入。Condition也提供了acquire, release方法,其含义与琐的acquire, release方法一致,其实它只是简单的调用内部琐对象的对应的方法而已。基于此同步原语, 我实现了一个基本简单的线程安全的优先队列:
import heapq
import threading
# import time class Item:
def __init__(self, name):
self.name = name def __repr__(self):
return 'Item({!r})'.format(self.name) class PriorityQueue:
def __init__(self):
self._queue = []
self._index = 0
self.mutex = threading.Lock()
self.cond = threading.Condition() def push(self, item, priority):
self.cond.acquire()
heapq.heappush(self._queue, (-priority, self._index, item)) # 存入一个三元组, 默认构造的是小顶堆
self._index += 1
self.cond.notify() # 唤醒一个挂起的线程
self.cond.release() def pop(self):
self.cond.acquire()
if len(self._queue) == 0: # 当队列中数据的数量为0 的时候, 阻塞线程, 要实现线程安全的容器, 其实不难, 了解相关同步原语的机制, 设计好程序执行时的逻辑顺序(在哪些地方阻塞, 哪些地方唤醒)
self.cond.wait() # wait方法释放内部所占用的锁, 同时线程被挂起, 知道接收到通知或超时, 当线程被唤醒并重新占用锁, 程序继续执行下去
else:
x = heapq.heappop(self._queue)[-1] # 逆序输出
self.cond.release()
return x def 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()

我还实现了一个基于event 线程安全的优先队列,请看<基于condition 实现的线程安全的优先队列(python实现)>
基于condition 实现的线程安全的优先队列(python实现)的更多相关文章
- 基于event 实现的线程安全的优先队列(python实现)
		
event 事件是个很不错的线程同步,以及线程通信的机制,在python的许多源代码中都基于event实现了很多的线程安全,支持并发,线程通信的库 对于优先队列的堆实现,请看<python下实现 ...
 - 基于C++11实现线程池的工作原理
		
目录 基于C++11实现线程池的工作原理. 简介 线程池的组成 1.线程池管理器 2.工作线程 3.任务接口, 4.任务队列 线程池工作的四种情况. 1.主程序当前没有任务要执行,线程池中的任务队列为 ...
 - 再谈AbstractQueuedSynchronizer:共享模式与基于Condition的等待/通知机制实现
		
共享模式acquire实现流程 上文我们讲解了AbstractQueuedSynchronizer独占模式的acquire实现流程,本文趁热打铁继续看一下AbstractQueuedSynchroni ...
 - 再谈AbstractQueuedSynchronizer2:共享模式与基于Condition的等待/通知机制实现
		
共享模式acquire实现流程 上文我们讲解了AbstractQueuedSynchronizer独占模式的acquire实现流程,本文趁热打铁继续看一下AbstractQueuedSynchroni ...
 - Java 并发编程-再谈 AbstractQueuedSynchronizer 2:共享模式与基于 Condition 的等待 / 通知机制实现
		
共享模式acquire实现流程 上文我们讲解了AbstractQueuedSynchronizer独占模式的acquire实现流程,本文趁热打铁继续看一下AbstractQueuedSynchroni ...
 - 基于C++11的线程池实现
		
1.线程池 1.1 线程池是什么? 一种线程管理方式. 1.2 为什么用线程池? 线程的创建和销毁都需要消耗系统开销,当线程数量过多,系统开销过大,就会影响缓存局部性和整体性能.而线程池能够在充分利用 ...
 - 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁
		
并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...
 - Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信
		
如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能用wait().notify().notifyAll()方法进行线程 ...
 - 基于 JVMTI 实现 Java 线程的监控(转)
		
随着多核 CPU 的日益普及,越来越多的 Java 应用程序使用多线程并行计算来充分发挥整个系统的性能.多线程的使用也给应用程序开发人员带来了巨大的挑战,不正确地使用多线程可能造成线程死锁或资源竞争, ...
 
随机推荐
- 文档发布工具mkdocs
			
mkdocs是Python的一个对 Markdown 友好的文档生成器.,小巧精美. MkDocs is a fast, simple and downright gorgeous static si ...
 - Android开发_TextView跑马灯
			
关键代码: android:singleLine="true" android:ellipsize="marquee" android:focusable=&q ...
 - java操作XML文件--读取内容
			
先把问题贴出来:编写一个可以解析xml及修改xml内容的工具类 由于我以前做过Android应用程序开发,之前也解析过xml文件,所以,这道题不是很难,这篇文章我先解决第一个问 ...
 - 查全率(召回率)、精度(准确率)和F值
			
文献中的recall rate(查全率或召回率) and precision(精度)是很重要的概念.可惜很多中文网站讲的我都稀里糊涂,只好用google查了个英文的,草翻如下:召回率和精度定义: 从一 ...
 - 后端分布式系列:分布式存储-HDFS DataNode 设计实现解析
			
前文分析了 NameNode,本文进一步解析 DataNode 的设计和实现要点. 文件存储 DataNode 正如其名是负责存储文件数据的节点.HDFS 中文件的存储方式是将文件按块(block)切 ...
 - 关于"net::ERR_CONNECTION_ABORTED"和"Firebug 达到了 Post 请求大小限制"的问题
			
1.其中"net::ERR_CONNECTION_ABORTED"是在Chrome的控制台中打印出来的. 2."Firebug 达到了 Post 请求大小限制" ...
 - OpenCV计算物体的重心坐标(2值图像)
			
效果图: 代码: // FindGravity.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
 - Dynamics CRM2013 sub grid中数据翻页问题
			
CRM2013中一个很低级很令人无语的BUG,见下图subgrid中的明细条目超过当前页设置的条目后会有翻页,在底下有个paging bar会显示条数.页数.当前所处页数 但sp1版本的CRM打上ur ...
 - Uva - 12174 - Shuffle
			
用滑动窗口的思想,用一个数组保存每个数在窗口中出现的次数.再用一个变量记录在窗口中恰好出现一次的的数的个数,这样可以枚举所有可能的答案,判断它所对应的所有串口,当且仅当所有的串口均满足要求时这个答案可 ...
 - Miscellaneous Articles
			
标记一下,慢慢看 http://www.oracle-base.com/articles/misc/articles-misc.php Miscellaneous Articles DBA Deve ...