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类相关推荐

  1. 生产者消费者_王敬之 | 消费者还是生产者

    点击上方蓝字关注我们 作者 | 王敬之 各位弟兄姐妹,各位主内家人,大家安息日平安!感谢主,我们在安息日再次通过网络一起来敬拜我们在天上的父.今天我们一起思考的主题是--"消费者还是生产者& ...

  2. [RabbitMQ]创建Java开发环境_消费者_生产者

    我们将用 Java 编写两个程序.发送单个消息的生产者和接收消息并打印出来的消费者.我们将介绍 Java API 中的一些细节. 在下图中," P"是我们的生产者," C ...

  3. java进程生产者消费者_生产者与消费者(多线程经典案例)

    packageorg.lx.multithreading ;classInfo//定义信息类{privateString name="罗星";//定义name属性privateSt ...

  4. python scatter 简书_【挖掘模型】:Python-DBSCAN算法 - 简书

    数据源:data (7).csv data (7).csv DBSCAN算法结果 DBSCAN模型 DBSCAN原理 # DBSCAN算法:将簇定义为密度相连的点最大集合,能够把具有足够高密度的区域划 ...

  5. python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...

    算法 数据结构 机器学习笔记--模型调参利器 GridSearchCV(网格搜索)参数的说明 GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数.但是这个 ...

  6. python分析每月销售数据_时间序列ARIMA模型详解:python实现店铺一周销售量预测...

    顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合.这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式.但是是什么令时间序列与常见的回归问题的不同? 有两个原因: 1.时间序 ...

  7. python 读取stl文件_读取STL模型 并用opengl显示

    说起STL模型,相信使用过CAD三维软件的人都不陌生, STL = STL文件,一种3D模型文件格式STL(STereo Lithography的缩写) STL文件格式是由3D SYSTEMS 公司于 ...

  8. python 解析pb文件_将tensorflow模型打包成PB文件及PB文件读取方式

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. 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 ...

最新文章

  1. 宏基因组实战6. 不比对快速估计基因丰度Salmon
  2. 如何卸载挂载的共享文件夹
  3. SqlServer操作远程数据库
  4. Cisco设备静态NAT基本配置步骤
  5. printf按8进制、16进制输出
  6. PCB板自动识别检测
  7. win10主机前置耳机孔无声音,但是后置有声音,按照下面的设置进行设计即可
  8. php最新猜骰子精美ui源码,ThinkPHP全新UI猜猜乐H5游戏源码
  9. IP地址格式 点分十进制
  10. JDK 运行参数 JAVA -Dxxx与System.setProperty()的关系
  11. 第四周作业part1
  12. Time Limit Exceeded的原因及避免方法
  13. 小白的JAVA学习笔记(九)---异常处理(try/catch/finally,ducking)
  14. 日期类的实现(C++编写练习类与对象)
  15. 二项分布、泊松分布,正态分布(高斯分布)之间的联系与区别
  16. thinkphp6实现微信V3服务商支付接口
  17. 使用python计算最大回撤
  18. solidworks中工程图标注三面焊符号
  19. hfss史密斯图_教你如何在天线设计上使用HFSS仿真软件?
  20. 你所不知道的口吃——口吃了该怎么办?

热门文章

  1. 翻译Java虚拟机的结构
  2. 工欲善其事必先利其器,用Emmet提高HTML编写速度
  3. redis用list做消息队列
  4. mybatis的拦截器及分页机制
  5. Win10/Server2016镜像集成离线补丁
  6. 2014025675 《嵌入式系统程序设计》第七周学习总结
  7. Journey Of Code组组员贡献率
  8. hdu 1027 输出第m个全排列(next_permutation)
  9. iTunes 11.2更新下载:改善播客阅读
  10. 鼠标指向表格时 显示更多信息 toolTipController1