目   录

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。

'''