线程队列queue
队列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的更多相关文章
- 网络编程基础--多线程---concurrent.futures 模块---事件Event---信号量Semaphore---定时器Timer---死锁现象 递归锁----线程队列queue
1 concurrent.futures 模块: # from abc import abstractmethod,ABCMeta # # class A(metaclass=ABCMeta): # ...
- 线程队列queue的使用
其实线程队列queue跟进程Queue的用法一样. 一.先进先出 import queue q = queue.Queue() q.put('kobe') q.put('cxk') print(q.g ...
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- (17)线程队列---queue LifoQueue PriorityQueue
线程常用队列有: queue LifoQueue PriorityQueue 语法: 大致和进程队列语法一致 put 往队列当中放值,超过队列长度,直接加阻塞 get 如果获取不到加阻塞 put_no ...
- python网络编程-线程队列queue
一:线程queu作用 Python中,queue是线程间最常用的交换数据的形式. 队列两个作用:一个是解耦,一个是提高效率 二:语法 1)队列的类 class queue.Queue(maxsize= ...
- 线程队列-queue
使用队列的目的: 解耦,使程序之间实现松耦合:提高处理效率 FIFO = 先进先出,first in first out LIFO = 后入先出,last in first out 生产者消费 ...
- day33 GIL锁 线程队列 线程池
1. 全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可 ...
- Python程序中的线程操作-线程队列
目录 一.线程队列 二.先进先出 三.后进先出 四.存储数据时可设置优先级的队列 4.1 优先级队列 4.2 更多方法说明 一.线程队列 queue队列:使用import queue,用法与进程Que ...
- python 线程队列PriorityQueue(优先队列)(37)
在 线程队列Queue / 线程队列LifoQueue 文章中分别介绍了先进先出队列Queue和先进后出队列LifoQueue,而今天给大家介绍的是最后一种:优先队列PriorityQueue,对队列 ...
随机推荐
- opencv第一课,安装配置
下载工具:本教程以OpenCV3.2.0为例. 解压:本教程解压到D盘,解压的其它地方也是可以的,解压完后得到一个名为opencv目录. 配置系统变量:选择此电脑(计算机)->右键属性选择-&g ...
- java 反射 处理 空值
package org.zkdg.utils.spring.annotations.impl; import java.lang.annotation.Annotation; import java. ...
- sharepoint_study_目录学习笔记(长期更新)
1. _catalogs/masterpage:这个是SharePoint网站的母版页样式库页面,这里放了网站上所有的母版页(网站设置--Web设计器库--母版页和页面布局). 2. 15\TEMP ...
- 1972 HH的项链
传送门 主席树解法设las[ i ]表示数列中第 i 个数的值 上一次出现的位置,num[ i ]为原数列中第 i 个数的值1. 把 从第 1 到第 i 个数的 las 的值 的出现次数 建立一个线 ...
- poj3713 Transferring Sylla 枚举+tarjan判割点
其实就是判断是否为三连通图 三连通图指的是去掉3个点就不连通的图,但是并没有直接求三连通的算法.著名的Tarjan算法可以求解连通和割点,再枚举删除一个点就能达到三连通的目的. 先看用例2,是由用例1 ...
- hdu2064 汉诺塔Ⅲ(递归)
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- sql游标及模仿游标操作
游标用途:对一个查询出来的结果,每一行作为参数进行操作 一:游标操作 --申请一个游标 DECLARE MyCursor CURSOR FOR SELECT ID FROM dbo.tb_stock ...
- 提取SQL中用到的表
dos2unix * for i in `ls` do :}` awk '{print tolower($0)}' "${i}"|grep -Eiw "from" ...
- edis Cluster实现原理
一.Redis Cluster主要特性和设计 集群目标 1)高性能和线性扩展,最大可以支撑到1000个节点:Cluster架构中无Proxy层,Master与slave之间使用异步replic ...
- Robot Framework自动化测试(一)
=============所需要环境========== Python: https://www.python.org/ RF框架是基于python 的,所以一定要有python环境. Robot f ...