多线程下的队列问题
Posted ddzc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程下的队列问题相关的知识,希望对你有一定的参考价值。
线程间队列通信
线程间通信用到的队列和进程间的通信队列不同,进程中的队列是在multiprocessing模块中封装的,从该模块导入即可,但是线程间的通信队列需要单独导入queue模块,threading模块中没有封装。
- Queue:
- 导入:import queue
- 这个可以用于服务行业,先进先出
- 实例化对象:q = queue.Queue(num), num用于控制队列的大小,可以放多少数据。
- 放入数据:q.put(数据)
- 取出数据:q.get()
- 队列长度不够,还要放入数据:q.put_nowait(数据),这种会报异常:queue.Full。可以添加异常处理,但是因为使用该方法后数据会丢失,所以不推荐使用该方法。
- 没有数据了还有取:q.get_nowait(),这种也会报异常:queue.Empty,可以设定异常处理:
try:
print(q.get_nowait())
except queue.Empty:
# queue.Empty不是内置的错误,而是queue模块中的错误,可以直接使用模块.错误类型来调用
print('队列中没有数据')
- LifoQueue:
- 被称为后进先出的队列,但是其实就是个栈
- 服务行业不会用到,这个多用于算法的开发
- 导入:from queue import LifoQueue
- 实例化:lq = LifoQueue()
- 放入数据:lq.put(数据)
- 取出数据:lq.get(数据)
- PriorityQueue:
- 优先级队列
- 这个多用于VIP会员的程序开发
- 导入:from queue import PriorityQueue
- 实例化:pri = PriorityQueue()
- 放入数据:pri.put((num, 数据)),注意是元组,第一个参数是序号
- 取出数据:pri.get(),获取数据是把序号作为优先级来获取的,序号数字越小越先出,序号的排序是根据ASCII码进行排序的,不是普通的数字排序方法。
from queue import PriorityQueue
pri = PriorityQueue()
pri.put((1, '福娃'))
pri.put((2, '奥运'))
pri.put((0, '五环'))
print(pri.get())
print(pri.get())
print(pri.get())
'''结果是:
(0, '五环')
(1, '福娃')
(2, '奥运')
'''
以上是关于多线程下的队列问题的主要内容,如果未能解决你的问题,请参考以下文章