一、队列(Queue)

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

常用方法:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回True,反之False
  • Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]])获取队列,timeout等待时间
  • Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
  • Queue.put(item) 写入队列,timeout等待时间
  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作

示例代码如下:

from Queue import Queue,LifoQueue,PriorityQueue
#先进先出队列
q=Queue(maxsize=5)
#后进先出队列
lq=LifoQueue(maxsize=6)
#优先级队列
pq=PriorityQueue(maxsize=5)for i in range(5):q.put(i)lq.put(i)pq.put(i)print "先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full())
print "后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full())
print "优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full())print q.get(),lq.get(),pq.get()print "先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full())
print "后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full())
print "优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full())
先进先出队列:deque([0, 1, 2, 3, 4]);是否为空:False;多大,5;是否满,True
后进先出队列:[0, 1, 2, 3, 4];是否为空:False;多大,5;是否满,False
优先级队列:[0, 1, 2, 3, 4];是否为空:False,多大,5;是否满,True
0 4 0
先进先出队列:deque([1, 2, 3, 4]);是否为空:False;多大,4;是否满,False
后进先出队列:[0, 1, 2, 3];是否为空:False;多大,4;是否满,False
优先级队列:[1, 3, 2, 4];是否为空:False,多大,4;是否满,False

还有一种队列是双边队列,示例代码如下:

from Queue import deque
dq=deque(['a','b'])
dq.append('c')
print dq
print dq.pop()
print dq
print dq.popleft()
print dq
dq.appendleft('d')
print dq
print len(dq)
deque(['a', 'b', 'c'])
c
deque(['a', 'b'])
a
deque(['b'])
deque(['d', 'b'])
2

二、生产者消费者模式

生产者消费者模式并不是GOF提出的众多模式之一,但它依然是开发同学编程过程中最常用的一种模式

生产者模块儿负责产生数据,放入缓冲区,这些数据由另一个消费者模块儿来从缓冲区取出并进行消费者相应的处理。该模式的优点在于:

  • 解耦:缓冲区的存在可以让生产者和消费者降低互相之间的依赖性,一个模块儿代码变化,不会直接影响另一个模块儿
  • 并发:由于缓冲区,生产者和消费者不是直接调用,而是两个独立的并发主体,生产者产生数据之后把它放入缓冲区,就继续生产数据,不依赖消费者的处理速度

三、采用生产者消费者模式开发的Python多线程

在Python中,队列是最常用的线程间的通信方法,因为它是线程安全的,自带锁。而Condition等需要额外加锁的代码操作,在编程对死锁现象要很小心,Queue就不用担心这个问题。

Queue多线程代码示例如下:

from Queue import Queue
import time,threading
q=Queue(maxsize=0)def product(name):count=1while True:q.put('气球兵{}'.format(count))print ('{}训练气球兵{}只'.format(name,count))count+=1time.sleep(5)
def consume(name):while True:print ('{}使用了{}'.format(name,q.get()))time.sleep(1)q.task_done()
t1=threading.Thread(target=product,args=('wpp',))
t2=threading.Thread(target=consume,args=('ypp',))
t3=threading.Thread(target=consume,args=('others',))t1.start()
t2.start()
t3.start()

网上还有很多非常好的生产者消费者模式的Queue代码例子,开发同学需要根据具体的实际需求去设计实际模式

Python 队列(Queue)用法相关推荐

  1. Python队列Queue

    Python队列Queue Queue是python标准库中的线程安全的队列(FIFO),提供了一个多线程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递. 常见方法 1.put( ...

  2. C++队列queue用法详解

    一.定义 queue是一种容器转换器模板,调用#include< queue>即可使用队列类. 二.queue初始化 queue<Type, Container> (<数 ...

  3. python队列queue不堵塞_python 队列(queue)阻塞

    背景:python 队列 queue.Queue 或 multiprcessing.Queue 或其他队列在写入队列或从队列中读取元素时,都有可能会发生线程阻塞. 下面来说一下阻塞的类型,然后怎么避免 ...

  4. oracle 删除 queue,C++ stl队列Queue用法介绍:删除,插入等操作代码举例

    c++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型. C++队列Queue是一种容 ...

  5. Python 队列 queue

    Python 队列 一.分类 1. Queue 标准队列,先进先出(FIFO),队尾插入,队头取元素. 2. LifoQueue 后进先出(first in last out).与栈的类似 3. Pr ...

  6. python中几种队列Queue用法区别

    python中使用到的队列模块大致有三个: 1.from queue import Queue 此模块适用于线程间通信,但不能用于进程间通信. 示例代码1:   [注意:此时代码存在错误!!!] im ...

  7. Python|队列Queue

    一 前言 本文算是一次队列的学习笔记,Queue 模块实现了三种类型的队列,它们的区别仅仅是队列中元素被取回的顺序.在 FIFO 队列中,先添加的任务先取回.在 LIFO 队列中,最近被添加的元素先取 ...

  8. python队列queue不堵塞_python队列Queue

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  9. java队列(Queue)用法总结

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 1.队列的特点 队列是一种比较特殊的线 ...

  10. python队列Queue的详解

    Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信. 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个 ...

最新文章

  1. 【C++】clipp 一个命令行参数解析器
  2. 李迅雷+但斌+趋势的力量+对话PPT
  3. TopCoder 入门教程 -- sqybi完善版
  4. 【转】激活 ActiveX 控件
  5. tps 数据库写并发衡量_MPP数据库简介
  6. matlab 中产生高斯白噪声
  7. python从入门到精通需要多久-Python从入门到精通只需要一个月就够了!
  8. 【Foreign】Weed [线段树]
  9. centos 7 sogou input
  10. 微信红包封面,你真的领取到了吗?
  11. java程序员 .net 程序员_Java 程序员 和 .NET 程序员
  12. 知识图谱从入门到应用——知识图谱的知识表示:向量表示方法
  13. 解决es集群Yellow与Red的问题
  14. 如何使用Joplin搭建私有笔记软件
  15. aspx页面乱码问题解决
  16. 香港科大三项研究登榜2020年度香港十大创科新闻
  17. Parasoft案例研究:医疗器械软件验证与合规性
  18. UX设计师是做什么的,现在怎么样
  19. QPSK的调制与解调
  20. dem生成等高线教程-dem提取等高线教程

热门文章

  1. 汇编指令msr_ARM汇编:MRS和MSR指令
  2. 开心测试卷答案软件六下外研版,外研版六下英语Module10达标检测卷含答案
  3. 使用ipset精简iptables规则的IP列表
  4. 初窥Zookeeper之watch
  5. 嵌入式入门和项目实战开发【菜鸟内心深处最真实感想篇】
  6. 【软考-中级】系统集成项目管理工程师-【10 项目质量管理】
  7. 鸿蒙系统之铠甲勇士,6.1《铠甲勇士OL》新系统点爆速度 热情
  8. 用python画的炫酷图形_推荐一个炫酷Python 手绘图形库
  9. C++进阶之路——基础题04
  10. TCP/IP协议之网络管理协议