队列

  • 创建一个被多个线程共享的 Queue 对象,这些线程通过使用 put() 和 get() 操作来向队列中添加或者删除元素。

    注意

  • 最好不要使用这些方法

    • q.qsize() , q.full() , q.empty()
    • 这些方法都不是线程安全的,可能你对一个队列使用 empty() 判断出这个队列为空,但同时另外一个线程可能已经向这个队列中插入一个数据项
  • 避免当执行某些特定队列操作时发生无限阻塞的情况

    1. def producer(q):
    2. ...
    3. try:
    4. q.put(item, block=False)
    5. except queue.Full:
    6. log.warning('queued item %r discarded!', item)
  • 超时自动终止以便检查终止标志 ``` _running = True

def consumer(q): while _running: try: item = q.get(timeout=5.0)

  1. # Process item
  2. ...
  3. except queue.Empty:
  4. pass
  1. - **最好只传递不可修改的数据结构**
  2. - (如:整型、字符串或者元组)或者一个对象的深拷贝

from queue import Queue from threading import Thread import copy

A thread that produces data

def producer(out_q): while True:

  1. # Produce some data
  2. ...
  3. out_q.put(copy.deepcopy(data))

A thread that consumes data

def consumer(in_q): while True:

  1. # Get some data
  2. data = in_q.get()
  3. # Process the data
  4. ...

```