多线程下的队列问题

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, '奥运')
'''

以上是关于多线程下的队列问题的主要内容,如果未能解决你的问题,请参考以下文章

多线程下的阻塞队列特性及使用

JAVA并发编程实战12使用condition实现多线程下的有界缓存先进先出队列

C#多线程处理多个队列数据的方法

多线程编程

多线程环境下队列操作之锁的教训

多线程