队列queue

  • 队列用于线程之间安全的信息交换
  • 队列和列表的区别:队列里的信息get()后就没了,而列表获取数据则是copy,原列表里的值还在

使用前先实例化队列

  • q = queue.Queue(maxsize=0)#先入先出,默认队列大小无限制
  • q = queue.LifoQueue(maxsize=0)#后入先出
  • q = queue.PriorityQueue(maxsize=0)#存储数据时可设置优先级的队列
  • 使用此类型队列时,put入一个元组,按元组的第一个值排序
  • put((2,'lmc')),put((-1,'pwd')),数字排序,越小的先出,这里第一次get()将获得(-1,'pwd')
  • put(('linux','ubuntu')),put(('apple','mac')),字符串排序,a<l,这里第一次get()将获得('apple','mac')

使用q.put(item)存入信息

  • put('a str')
  • put(1)

使用q.get()取出信息

  • get()会根据q实例化的类型取出信息(queue.Queue,先取出的是“a str”,LifoQueue先取出的则是1
  • get()时,如果超过put()入队列数量(qsize()),则会挂起等待下一个put()后继续执行

Queue.put_nowait(item)等价于 put(item, False)

  • 如果设置队列最大上限maxsize,put()时超过最大上限,则会挂起等待下一个get()取出信息后执行
  • 使用put_nowait()如果超过上限,则会抛出错误,不会挂起

Queue.get_nowait()等价于Queue.get(block=True, timeout=None)

  • 使用get_nowait()如果超过put()数量,即队列里没信息了,不会挂起,会抛出错误

其他方法

  • Queue.qsize() 队列当前大小
  • Queue.empty() #如果队列为空返回True
  • Queue.full() # 如果队列已满返回True,前提已设置了maxsize

生产者消费者模型

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

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

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

  • 什么是生产者消费者模式

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

  • 基本的一个例子

import threading
import queue def producer():
for i in range(10):
q.put("骨头 %s" % i )
print("开始等待所有的骨头被取走...")
q.join()
print("所有的骨头被取完了...") def consumer(n): while q.qsize() >0: print("%s 取到" %n , q.get())
q.task_done() #告知这个任务执行完了 q = queue.Queue()
p = threading.Thread(target=producer,)
p.start()
c1 = consumer("李闯")

线程队列queue的更多相关文章

  1. 网络编程基础--多线程---concurrent.futures 模块---事件Event---信号量Semaphore---定时器Timer---死锁现象 递归锁----线程队列queue

    1 concurrent.futures 模块: # from abc import abstractmethod,ABCMeta # # class A(metaclass=ABCMeta): # ...

  2. 线程队列queue的使用

    其实线程队列queue跟进程Queue的用法一样. 一.先进先出 import queue q = queue.Queue() q.put('kobe') q.put('cxk') print(q.g ...

  3. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  4. (17)线程队列---queue LifoQueue PriorityQueue

    线程常用队列有: queue LifoQueue PriorityQueue 语法: 大致和进程队列语法一致 put 往队列当中放值,超过队列长度,直接加阻塞 get 如果获取不到加阻塞 put_no ...

  5. python网络编程-线程队列queue

    一:线程queu作用 Python中,queue是线程间最常用的交换数据的形式. 队列两个作用:一个是解耦,一个是提高效率 二:语法 1)队列的类 class queue.Queue(maxsize= ...

  6. 线程队列-queue

    使用队列的目的: 解耦,使程序之间实现松耦合:提高处理效率   FIFO = 先进先出,first in first out LIFO = 后入先出,last in first out   生产者消费 ...

  7. day33 GIL锁 线程队列 线程池

    1.    全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可 ...

  8. Python程序中的线程操作-线程队列

    目录 一.线程队列 二.先进先出 三.后进先出 四.存储数据时可设置优先级的队列 4.1 优先级队列 4.2 更多方法说明 一.线程队列 queue队列:使用import queue,用法与进程Que ...

  9. python 线程队列PriorityQueue(优先队列)(37)

    在 线程队列Queue / 线程队列LifoQueue 文章中分别介绍了先进先出队列Queue和先进后出队列LifoQueue,而今天给大家介绍的是最后一种:优先队列PriorityQueue,对队列 ...

随机推荐

  1. (一)ByteDance编程题

    题目: 公司的程序员不够用了,决定把产品经理都转变为程序员以解决开发时间长的问题. 在给定的矩形网格中,每个单元格可以有以下三个值之一: 值0代表空单元格 值1代表产品经理 值2代表程序员 每分钟,任 ...

  2. Python集合字典运算符

    1.集合2.字典3.运算符优先级 1.集合 创建:{} set([]) 注意:创建空的集合要用set()   特点:元素唯一,无序   运算: & 交集 | 并集 - 差集   方法:   s ...

  3. Winscp使用密钥登录

    Winscp使用密钥登录 背景:通常我们使用winscp通过密码认证去连接服务器进行文件的ftp操作,但是为了安全,我们服务器上经常会禁止使用密码连接,而改用密钥认证.而且服务器上经常会禁止root用 ...

  4. BAPC 2014:Button Bashing(暴力+bfs)

    题意: 给出n,m,代表微波炉有n个按钮,要求达到总时间为m 然后给出n个数,代表n个按钮能增加的时间,问最少几步,能够使得按出的总时间大于等于要求的时间,并且相差最小 输出最小的步数与相差的最小值 ...

  5. 爬虫初识和request使用

    一.什么是爬虫 爬虫的概念: 通过编写程序,模拟浏览器上网,让其去互联网上爬取数据的过程. 爬虫的工作流程: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或 ...

  6. redis备份恢复

    redis的几种数据导入导出方式[转]   环境说明:202.102.221.11 redis源实例202.102.221.12 redis目标实例202.102.221.13 任意linux系统 一 ...

  7. JavaScript 将数组中具有相同值的对象 取出组成新的数组

    var arr=[{name:2,id:3},{name:2,id:4},{name:3,id:5},{name:3,id:6},{name:1,id:1},{name:1,id:2}]; // 传入 ...

  8. 转 ogg issue

    1.http://www.dbdream.com.cn/2013/05/17/ogg-00446%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3/ OGG-00446错误解决 ...

  9. ckeditor(在线文本编辑器)使用教程

    ckeditor是一款由javascript编写的富文本网页编辑器,它可以填写文字.插入图片.视频.Excel等富媒体信息,也可以在源码方式下填写内容,在各个网站中应用非常广泛. 下面就来说说cked ...

  10. windows下修改了系统变量里java_home所引用的jdk,但是查询jdk的版本并没有发生改变

    # 原因:因为%SystemRoot%\system32 在引用这个环境变量时,会默认C:\Windows\System32下的jdk版本 # 解决方法: 把jdk的配置放在path前面就可以了