Python编程:queue队列

举报
彭世瑜 发表于 2021/08/14 01:20:13 2021/08/14
【摘要】 queue队列 先入先出队列 first in first out import queue q1 = queue.Queue() q1.put(1) q1.put(2) q1.put(3) print(q1.get()) print(q1.get()) print(q1.get()) # 1 2 3123456789101112 后入先出队列 last i...

queue队列

先入先出队列 first in first out

import queue

q1 = queue.Queue()

q1.put(1)
q1.put(2)
q1.put(3)

print(q1.get())
print(q1.get())
print(q1.get())
# 1 2 3
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

后入先出队列 last in first out

import queue

q2 = queue.LifoQueue()

q2.put(1)
q2.put(2)
q2.put(3)

print(q2.get())
print(q2.get())
print(q2.get())
# 3 2 1
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

优先级队列

import queue

q3 = queue.PriorityQueue()

q3.put((10, 1))
q3.put((9, 2))
q3.put((8, 3))

print(q3.get())
print(q3.get())
print(q3.get())
# (8, 3)  (9, 2)  (10, 1)
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

生产者消费者模型

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。
该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

为什么要使用生产者和消费者模式

在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。
在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,
那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,
如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。
为了解决这个问题于是引入了生产者和消费者模式。

什么是生产者消费者模式

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。
生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,
所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,
消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,
平衡了生产者和消费者的处理能力。

实例代码

import queue, threading, time

q = queue.Queue(maxsize=10)

def producer(name): count = 0 while True: count += 1 q.put("包子 %s" % count) print("%s 生产了一个包子" % name) time.sleep(2)

def consumer(name): while True: print("%s 得到了 %s" % (name, q.get()))

p1 = threading.Thread(target=producer, args=("生产者1",))
c1 = threading.Thread(target=consumer, args=("消费者1",))
c2 = threading.Thread(target=consumer, args=("消费者2",))

p1.start()
c1.start()
c2.start()
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

阻塞队列

import queue, threading, time

q = queue.Queue()

def producer(name): for i in range(5): q.put("包子 %s" % i) print("等待取走") q.join()  # 等待通知,全部取走则继续 print("全都取走了")


def consumer(name): while q.qsize() > 0: print("%s 得到了 %s" % (name, q.get())) q.task_done()  # 告知一次任务结束

p1 = threading.Thread(target=producer, args=("生产者1",))
p1.start()

c = consumer("消费者")
"""
等待取走
消费者 得到了 包子 0
消费者 得到了 包子 1
消费者 得到了 包子 2
消费者 得到了 包子 3
消费者 得到了 包子 4
全都取走了
"""
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/79146202

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。