目 录
1. 什么是线程安全?
2. Python Queue 模块
2.1 Python Queue 实现的队列类
2.2 Python Queue 提供的类和函数
2.2.1 提供的类
2.2.2 提供的异常 Exception
2.2.3 提供的函数
1. 什么是线程安全?
在前面 threading 模块中的学习中,我们谈论了全局解释锁 GIL、Lock/RLock 等,其实都是为了保证多线程使用中的线程安全。在并发场景中,如果线程不安全,多个线程同时进行同一个资源文件的操作,可能带来不可预知的风险。
此外,threading.Condtion、threading.Semaphore/BoundedSemaphore、threading.Event 、还有 threading.Barrier 小节中提到的线程等待列表,当同时唤醒线程等待列表中的多个列表时候,有可能出现不同的线程被唤醒,这时候结果也是不确定的。如果想用确定的线程列表怎么办,我们来看看 Queue 模块吧。
2. Python Queue 模块
2.1 Python Queue 实现的队列类
Python Queue 模块提供了同步的、线程安全的队列类, 这些队列都实现了锁原语,能够在多线程中直接使用。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。
Queue 模块中实现的队列类有下面四种:
1、FIFO 队列,先入先出队列,其添加的第一个任务是第一个检索的任务;
2、LIFO 队列,后入先出队列,其最近添加的任务是第一个检索的(像堆栈);
3、Priority 队列,其条目将按照计算的优先级值排序,并首先检索优先级最低值的条目。
4、Python 3 中新加双向队列,可以提供在队列两端进行的数据访问优化操作。
2.2 Python Queue 提供的类和函数
2.2.1 提供的类
queue 模块中最主要的是 Queue 类,LifoQueue、PriorityQueue 都继承了 Queue 类;deque、SimpleQueue 则继承自 builtins.object 。
1) Queue.Queue(maxsize = 0 )
FIFO 队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,将不再延长队列长度,直到消耗队列项。如果 maxsize 小于或等于0,则队列大为无限队列。
相关方法和属性,在后续章节详细描述。
2) Queue.LifoQueue(maxsize = 0 )
LIFO 队列的构造函数。 maxsize 含义同Queue.Queue 中的maxsize 。
相关方法和属性,在后续章节详细描述。
3) Queue.PriorityQueue(maxsize = 0 )
Priority 队列的构造函数。 maxsize 含义同Queue.Queue 中的maxsize 。
相关方法和属性,在后续章节详细描述。
4) Queue.duque ([iterable[, maxlen]])
双向队列的构造函数。
相关方法和属性,在后续章节详细描述。
5) Queue.SimpleQueue()
简单、无限、可重入的 FIFO 队列构造函数。
相关方法和属性,在后续章节详细描述。
6) Queue.threading()
模拟 Java 线程模型子集的线程模块。
相关方法和属性,在后续章节详细描述。
2.2.2 提供的异常 Exception
1) Queue.Empty
在 queue 对象为空时调用 get*() 方法时引发异常。
2) Queue.Full
在 queue 对象已满时调用 put*() 时引发异常。
2.2.3 提供的函数
1) heappop(heap, /)
模块_heapq 中的内置函数 heappop,弹出 heap 中的最小项,维持 heap 稳定不变。
2) heappush(heap, item, /)
模块_heapq 中的内置函数 heapppush,推入新项进入 heap 中,维持 heap 稳定不变。
3) time()
模块 time 中的内置函数 monotonic。
'''