博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
queue队列
阅读量:2302 次
发布时间:2019-05-09

本文共 2679 字,大约阅读时间需要 8 分钟。

概念

队列也是一种数据结构,和列表有点像,但是内置了锁。队列用于多线程编程时线程间的通讯,能保证线程安全。

创建

import queue

q = queue.Queue(maxsize)
括号内可以指定队列长度,默认是无限长度。
这样就创建了一个FIFO先进先出队列,它是单向的,左边放,右边取。

方法

  • q.put(item, block=True, timeout=None) 往队列内放入元素item,默认是阻塞模式,线程会一直阻塞到队列中有空间为止。可以指定超时时间。如果指定block=False,队列满时放元素会报错。
  • q.get(block=True, timeout=None) 从队列中取出一个元素,默认是阻塞模式,线程会一直阻塞到队列中有元素为止。如果指定block=False,队列为空时取元素会报错。
  • q.qsize() 返回队列的大小
  • q.empty() 返回bool值
  • q.full() 返回bool值
  • q.get_nowait() ===> q.get(block=False)
  • q.put_nowait() ===> q.put(block=False)
  • q.join() (Blocks until all items in the Queue have been gotten and processed) 生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止
  • q.task_done() 使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。如果调用此方法的次数大于从队列中删除项目的数量,将引发ValueError异常

If a join() is currently blocking, it will resume when all items have been processed (meaning that a task_done() call was received for every item that had been put() into the queue)
import queueq = queue.Queue(5)q.put('a')q.put('b')print(q.get())  # 取出一个元素,每取出一个元素都要发送task_done()信号q.task_done()   print(q.get())q.task_done()   # 如果这一行注释掉,那么jion()会阻塞,下面也就不会打印q.join()print('ending')

生产者消费者模式

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

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

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

什么是生产者消费者模式

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

基于队列实现生产者消费者模式:

import queueimport threadingimport time, randomdef producer(seq):    for item in seq:        time.sleep(random.random())        q.put(item)        print('生产者生产了:',item)    q.put(None)def consumer():    while True:        time.sleep(random.randint(2,3))        res = q.get()        if res is None:break        print('消费者消费了:',res)if __name__ == '__main__':  # windows下,统一把进程线程写到if __name__ == '__main__':内,不会报错    q = queue.Queue()    seq = ('包子%s'%i for i in range(10))    pro = threading.Thread(target=producer, args=(seq,))    # 生产者线程,可以在主进程,也可以开多个    con = threading.Thread(target=consumer)   # 消费者线程,可以开多个    pro.start()    con.start()    pro.join()    con.join()    print('完成了生产消费')

对列的其它模式

后进先出/先进后出

q= queue.LifoQueue()

import queueq = queue.LifoQueue()q.put(1)q.put(2)q.put(3)print(q.get())print(q.get())print(q.get())'''321'''

优先级

q = queue.PriorityQueue()

Variant of Queue that retrieves open entries in priority order (lowest first).Entries are typically tuples of the form: (priority number, data).

import queueq = queue.PriorityQueue()q.put('hello') q.put('world')q.put('bbc')print(q.get())print(q.get())print(q.get())'''由低到高取bbchelloworld'''

转载地址:http://xhdib.baihongyu.com/

你可能感兴趣的文章
java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
查看>>
jQuery.validator.addMethod自定义验证方法【在表单验证中的使用 $("#appEdit_Form").validate({rules : {},messages:{}】
查看>>
jQuery怎么获取一些属性值类似的控件,又怎么遍历他们呢?
查看>>
WARN com.opensymphony.xwork2.ognl.OgnlValueStack异常的解决办法[提交按钮使用了图片并设置name属性,对应action无gettersetter]
查看>>
一般操作需要导入的jquery包(jquery.js包)和 jquery操作select下拉列表(取值及设置选中某一个option)
查看>>
在页面加载完成后通过jquery给多个span赋html值(当前系统时间本地格式化new Date().toLocaleDateString(); )
查看>>
SSH原理与运用(一):远程登录和SSH原理与运用(二):远程操作与端口转发
查看>>
基于jQuery的AJAX和JSON的实例[另附文章:深入浅出json]
查看>>
jquery.validate的ajax方式验证[可以一个控件下一次传递多个参数,已经成功通过验证]
查看>>
easyui自带的日历功能和生日年月日的三级联动
查看>>
SQLServer 数据库变成单个用户后无法访问问题的解决方法[在手动还原该数据库的时候,设置为单用户模式,然后其他用户访问的时候就。。。。]
查看>>
Linux安装Tomcat外部不能访问[主要是linux中防火墙规则的配置问题]
查看>>
linux相关csdn个人博客url
查看>>
linux中$#、$?、$$[脚本运行时当前进程的id号]、$@、$*、$0、$1、$2、$-[上一个命令的最后一个参数]
查看>>
VMware Workstation环境中Linux ping返回出现大量“DUP!”的解决方法[将Host的VMnet8虚拟网卡,先禁用,在启用]
查看>>
配置插件hadoop-1.2.1 eclipse开发环境 【hadoop的eclipse插件hadoop-eclipse-plugin-1.2.1.jar 下载地址和具体用法】
查看>>
encienqi-----JavaBean,List,Map转成json格式
查看>>
encienqi-----服务器端输出 JSON 格式数据
查看>>
awj-----TermQuery进行多字段搜索【lucene中调用此类extends Query对象】
查看>>
SolrCloud Wiki翻译(1) Getting Started with SolrCloud
查看>>