并发编程之线程queue

队列queue介绍

queue用于建立和操作队列,常和threading类一起用来建立一个简单的线程队列。

首先,队列有很多种,根据进出顺序来分类,可以分成

  • queue.Queue(maxsize)  FIFO(先进先出队列)

  • queue.LifoQueue(maxsize)  LIFO(先进后出队列)

  • Queue.PriorityQueue(maxsize)  为优先级越高的越先出来,对于一个队列中的所有元素组成的entries,优先队列优先返回的一个元素是sorted(list(entries))[0]。至于对于一般的数据,优先队列取什么东西作为优先度要素进行判断,官方文档给出的建议是一个tuple如(priority, data),取priority作为优先度。

如果设置的maxsize小于1,则表示队列的长度无限长

补充:

  • 同一个进程下的多个线程数据是共享的
  • 为什么在同一个进程下还要使用队列?
    • 因为队列 = 管道 + 锁
    • 使用队列是为了保证数据的安全

队列常用方法

FIFO是常用的队列,其一些常用的方法有:

  • queue.qsize()  返回队列大小

  • queue.empty() 判断队列是否为空

  • queue.full()  判断队列是否满了

  • queue.get([block[,timeout]]) 从队列头删除并返回一个item,block默认为True,表示当队列为空却去get的时候会阻塞线程,等待直到有有item出现为止来get出这个item。如果是False的话表明当队列为空你却去get的时候,会引发异常。在block为True的情况下可以再设置timeout参数。表示当队列为空,get阻塞timeout指定的秒数之后还没有get到的话就引发Full异常。

  • queue.put(...[,block[,timeout]])  向队尾插入一个item,同样若block=True的话队列满时就阻塞等待有空位出来再put,block=False时引发异常。同get的timeout,put的timeout是在block为True的时候进行超时设置的参数。

  • queue.task_done() 从场景上来说,处理完一个get出来的item之后,调用task_done将向队列发出一个信号,表示本任务已经完成

  • queue.join() 监视所有item并阻塞主线程,直到所有item都调用了task_done之后主线程才继续向下执行。这么做的好处在于,假如一个线程开始处理最后一个任务,它从任务队列中拿走最后一个任务,此时任务队列就空了但最后那个线程还没处理完。当调用了join之后,主线程就不会因为队列空了而擅自结束,而是等待最后那个线程处理完成了。

队列的分类

# 队列(先进先出)
import queue

q = queue.Queue()
q.put('1')
q.put('2')
q.put('3')
q.put('over')

print(q.get())
print(q.get())
print(q.get())
print(q.get())

# 1
# 2
# 3
# over
# 堆栈(后进先出)
import queue

q = queue.LifoQueue()
q.put('1')
q.put('2')
q.put('3')
q.put('over')

print(q.get())
print(q.get())
print(q.get())
print(q.get())

# over
# 3
# 2
# 1
# PriorityQueue设置队列优先级
import queue

q = queue.PriorityQueue(3)
# put进入一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
q.put((10, 'one'))
q.put((40, 'two'))
q.put((30, 'three'))

print(q.get())
print(q.get())
print(q.get())

# (10, 'one')
# (30, 'three')
# (40, 'two')

队列的应用

生产者消费者模型总结

#程序中有两类角色
    一类负责生产数据(生产者)
    一类负责处理数据(消费者)
    
#引入生产者消费者模型为了解决的问题是:
    平衡生产者与消费者之间的工作能力,从而提高程序整体处理数据的速度
    
#如何实现:
    生产者<-->队列<——>消费者
#生产者消费者模型实现类程序的解耦合
posted @ 2024-03-03 11:31  Xiao0101  阅读(49)  评论(0)    收藏  举报