python queue 生产者 消费者_生产者、消费者模型---Queue类
queue队列在几乎每种编程语言都会有,python的列表隐藏的一个特点就是一个后进先出(lifo)队列。而本文所讨论的queue是python标准库queue中的一个类。它的原理与列表相似,但是先进先出(fifo)队列。而内部实现更为完善,有很好的数据保护机制和较高的稳定性。
queue队列在编程中的实际应用:进程中的通信
假如两个进程需要互通数据,怎么做?用全局变量,然后在进程中通过global关键字引入全局变量?那么问题是,怎么控制时间效应问题,即什么时候获取、传送变量?如何保证数据的安全性?显然这种方案不是很恰当。python为实现进程的通信提出了几种机制,本文的queue就是其中一种。另外还有value,pipe,signal等。
关于signal可以看看我之前写的文章:
首先需要介绍queue的类方法:
1. put() 将元素塞进队列,当队列满时不阻塞等待
2. put_nowait() 将元素塞进队列,当队列满时阻塞等待
3. get() 从队列中取出元素,如果队列为空,阻塞等待
4.get_nowait() 从队列中取出元素,如果队列为空,不阻塞等待
5. full() 判断队列是否为已经满
6. empty() 判断队列是否为空
7. qsize() 获取队列的元素个数
8. task_done() 当队列中的任务完成之后会自动调用task_done通知queue,并对join()方法其作用
9. join() 阻塞等待直到所有的队列任务完成(被取出)
几个关键方法的详细解析
1. put(item,block = true,timeout = none)
将数据放进队列,item为需要塞进的元素,可以是基本数据类型变量,也可以是函数。block默认为true,即当queue已经满时,阻塞等待(阻塞是同步的,会影响下面的程序运行)。timeout为阻塞等待超时时间,单位为秒,当超过指定时间,退出阻塞,同时报出queue.full错误。
2. put_nowait(item)
基本用法与put相同。当队列为满时,不阻塞等待,相当于put(item,block = false)
3. get(block= true ,timeout = none)
获取队列元素,block默认为true,当队列为空时,阻塞等待。timeout为超时时间,单位为秒,当超过指定时间,退出等待。
一、queue类方法基本使用(为了方便调用接口,在queue基础上再进行了一次封装):
from queue import queue
class myqueue(): #自定义一个myqueue类
def __init__(self,size=3):
self.max_size = size
self.queue = queue(size)
#put()方法可以传入数值
# item1 = 2
# item2 = 3
# item3 = 3
# queue.put(item1)
# queue.put(item2)
# queue.put(item3)
# 超过长度的内容
# item4 = 5
# queue.put_nowait(item4)
#put()方法也可以传入函数
def _print_num(self,n):
num = n
return num
def write_queue(self):
for n in range(4):
try:
self.queue.put_nowait(self._print_num(n)) #如果队列已经满了,会报出full错误
except:
print('队列已经满了,无法添加内容')
def print_queue_length(self):
print('队列的长度是:',self.queue.qsize())
def get_queue(self):
if self.queue.empty() is false:
queue_size = self.queue.qsize()
n = 1
for i in range(queue_size):
if n > queue_size:
print('队列已经空了')
value = self.queue.get()
print('队列第%s个值是:%s'%(n,value))
n += 1
else:
print('队列已经空了')
#实例化代码
myqueue = myqueue()
myqueue.write_queue()
myqueue.print_queue_length()
myqueue.get_queue()
运行结果
二、多进程间通信:
from multiprocessing import process,manager
#将数据装进队列
def put_msg(q,lock):
lock.acquire()
for i in range(3):
print('put the %s into the queue'%i)
q.put(i)
lock.release()
#将数据取出
def get_msg(q):
while true:
if not q.empty():
value = q.get(false)
print('get the %s from the queue'%value)
else:
break
if __name__ == '__main__':
manager = manager()
q = manager.queue(5) #队列长度设为5
lock = manager.lock()
processes = []
process1 = process(target=put_msg,args=(q,lock))
process2 = process(target=get_msg,args=(q,))
processes.append(process1)
processes.append(process2)
for p in processes:
p.start()
p.join()
在父进程中创建queue,传入两个子进程,因为python中父进程无法与子进程进行通信,必须使用manage来实现。为了只有一个进程在对queue进行操作,使用manage的lock
结果:
put the 0 into the queue
put the 1 into the queue
put the 2 into the queue
get the 0 from the queue
get the 1 from the queue
get the 2 from the queue
参考文章:
希望与广大网友互动??
点此进行留言吧!
python queue 生产者 消费者_生产者、消费者模型---Queue类相关推荐
- 生产者消费者_王敬之 | 消费者还是生产者
点击上方蓝字关注我们 作者 | 王敬之 各位弟兄姐妹,各位主内家人,大家安息日平安!感谢主,我们在安息日再次通过网络一起来敬拜我们在天上的父.今天我们一起思考的主题是--"消费者还是生产者& ...
- [RabbitMQ]创建Java开发环境_消费者_生产者
我们将用 Java 编写两个程序.发送单个消息的生产者和接收消息并打印出来的消费者.我们将介绍 Java API 中的一些细节. 在下图中," P"是我们的生产者," C ...
- java进程生产者消费者_生产者与消费者(多线程经典案例)
packageorg.lx.multithreading ;classInfo//定义信息类{privateString name="罗星";//定义name属性privateSt ...
- python scatter 简书_【挖掘模型】:Python-DBSCAN算法 - 简书
数据源:data (7).csv data (7).csv DBSCAN算法结果 DBSCAN模型 DBSCAN原理 # DBSCAN算法:将簇定义为密度相连的点最大集合,能够把具有足够高密度的区域划 ...
- python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...
算法 数据结构 机器学习笔记--模型调参利器 GridSearchCV(网格搜索)参数的说明 GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数.但是这个 ...
- python分析每月销售数据_时间序列ARIMA模型详解:python实现店铺一周销售量预测...
顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合.这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式.但是是什么令时间序列与常见的回归问题的不同? 有两个原因: 1.时间序 ...
- python 读取stl文件_读取STL模型 并用opengl显示
说起STL模型,相信使用过CAD三维软件的人都不陌生, STL = STL文件,一种3D模型文件格式STL(STereo Lithography的缩写) STL文件格式是由3D SYSTEMS 公司于 ...
- python 解析pb文件_将tensorflow模型打包成PB文件及PB文件读取方式
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python三维向量运算_设计一个三维向量类,并实现向量的加法、减法以及向量与标量的乘...
Python 3.4.2代码如下 class Vecter3: def __init__(self, x=0, y=0, z=0): self.X = x self.Y = y self.Z = z ...
最新文章
- 宏基因组实战6. 不比对快速估计基因丰度Salmon
- 如何卸载挂载的共享文件夹
- SqlServer操作远程数据库
- Cisco设备静态NAT基本配置步骤
- printf按8进制、16进制输出
- PCB板自动识别检测
- win10主机前置耳机孔无声音,但是后置有声音,按照下面的设置进行设计即可
- php最新猜骰子精美ui源码,ThinkPHP全新UI猜猜乐H5游戏源码
- IP地址格式 点分十进制
- JDK 运行参数 JAVA -Dxxx与System.setProperty()的关系
- 第四周作业part1
- Time Limit Exceeded的原因及避免方法
- 小白的JAVA学习笔记(九)---异常处理(try/catch/finally,ducking)
- 日期类的实现(C++编写练习类与对象)
- 二项分布、泊松分布,正态分布(高斯分布)之间的联系与区别
- thinkphp6实现微信V3服务商支付接口
- 使用python计算最大回撤
- solidworks中工程图标注三面焊符号
- hfss史密斯图_教你如何在天线设计上使用HFSS仿真软件?
- 你所不知道的口吃——口吃了该怎么办?