作用:
- Queue模块用于实现生产者-消费者模型,保证多线程并发操作时的安全,基于各种必需的锁机制来保证并发操作的安全
- 模块支持三种队列:FIFO队列、LIFO队列、Priority队列
python版本:
函数定义:
- Queue.Queue(maxsize=0)
- FIFO队列
- maxsize标识允许的最大队列长度
- 队列满时,插入操作将阻塞--produce
- 队列空时,删除操作将阻塞--consume
- Queue.LifoQueue(maxsize=0)
- LIFO队列
- python 2.6及以后版本
- Queue.PriorityQueue(maxsize=0)
- 优先级队列
- 优先级值最低的最先访问,存储形式为:(priority_number, data)
- python 2.6及以后版本
- Queue.Empty
- 异常Exception
- 当调用非阻塞的get()、get_nowait()方法时,如果队列为空则抛出Queue.Empty异常
- Queue.Full
- 异常Exception
- 当调用非阻塞put()、put_nowait()方法时,如果队列为满则抛出Queue.Full异常
- Queue对象(Queue、LifoQueue、PriorityQueue)的方法定义
- qsize():返回的是近似大小,qsize()>0无法保证接下来的get()不会阻塞
- full():
- put(item[, block[, timeout]])
- put_nowait(item)
- get([block[, timeout]])
- get_nowait()
- task_done():consumer线程用于确认之前的操作(get and process)已经结束
- join():阻塞直到队列中的所有元素都被消费(get and process)
应用实例:
- 生产者-消费者模型:
- def worker():
- while True:
- item = q.get() #消费者取数据
- do_work(item)
- q.task_done() #当有线程因为join方法阻塞时,并且队列中的所有元素都调用了task_done()方法,则阻塞线程将resume
- q = Queue()
- for i in range(num_worker_threads):
- t = Thread(target=worker)
- t.daemon = True
- t.start()
- for item in source():
- q.put(item) #生产者,负责往队列中添加数据
- q.join() # block until all tasks are done