广告
返回顶部
首页 > 资讯 > 后端开发 > Python >[python模块]队列queue
  • 772
分享到

[python模块]队列queue

队列模块python 2023-01-31 07:01:07 772人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一、队列queue队列queue 多应用在多线程场景,多线程访问共享变量。对于多线程而言,访问共享变量时,队列queue的线程安全的。因为queue使用了一个线程锁(pthread.Lock()),以及三个条件变量(pthread.cond

一、队列queue

队列queue 多应用在多线程场景,多线程访问共享变量。

对于多线程而言,访问共享变量时,队列queue的线程安全的。

因为queue使用了一个线程(pthread.Lock()),以及三个条件变量(pthread.condition()),来保证了线程安全。

总结:队列提供了一个安全可靠的共享数据使用方案。

队列内置控制安全的几个参数,非用户使用名称作用
self.mutex互斥锁任何获取队列的状态(empty(),qsize()等),或者修改队列的内容的操作(get,put等)都必须持有该互斥锁。共有两种操作require获取锁,release释放锁。同时该互斥锁被三个共享变量同时享有,即操作conditiond时的require和release操作也就是操作了该互斥锁。
self.not_full

条件变量

队列没满

当队列中有元素添加后,会通知notify其他等待添加元素的线程,唤醒等待require互斥锁,或者有线程从队列中取出一个元素后,通知其它线程唤醒以等待require互斥锁。
self.not_empty

条件变量

队列不为空

线程添加数据到队列中后,会调用self.not_empty.notify()通知其它线程,唤醒等待require互斥锁后,读取队列。
self.all_tasks_done

条件变量

队列数据全部处理完

消费者线程从队列中get到任务后,任务处理完成,当所有的队列中的任务处理完成后,会使调用queue.join()的线程返回,表示队列中任务以处理完毕。
###queue的初始化函数###
def __init__(self, maxsize=0):
        self.maxsize = maxsize
        self._init(maxsize)
        
        # mutex must be held whenever the queue is mutating.  All methods    
        # that acquire mutex must release it before returning.  mutex    
        # is shared between the three conditions, so acquiring and    
        # releasing the conditions also acquires and releases mutex.  
          
        self.mutex = _threading.Lock()   
         
        # Notify not_empty whenever an item is added to the queue; a    
        # thread waiting to get is notified then.    
        
        self.not_empty = _threading.Condition(self.mutex)    
        
        # Notify not_full whenever an item is removed from the queue;    
        # a thread waiting to put is notified then.    
        
        self.not_full = _threading.Condition(self.mutex)    
        
        # Notify all_tasks_done whenever the number of unfinished tasks    
        # drops to zero; thread waiting to join() is notified to resume   
         
        self.all_tasks_done = _threading.Condition(self.mutex)    
        self.unfinished_tasks = 0

 

 

二、队列数据存取规则:

数据使用方式
类名
作用示例
FIFO先进先出
Queue(maxsize)

先进入队列的数据,先取出

maxsize:>=0

设置队列长度,0为无限长


q = queue.Queue()
FILO先进后出
LifoQueue(maxsize)

先进入队列的数据,最后取出

maxsize:>=0

设置队列长度,0为无限长


q = queue.LifoQueue()
Priority优先级
PriorityQueue(maxsize)

设置优先标志,优先取出高标志位

maxsize:>=0

设置队列长度,0为无限长


q = queue.PriorityQueue()

 

 

###例子一:先进先出###
import queue
q = queue.Queue()
for i in range(5):
    q.put(i)
    
for i in range(5):
    print(q.get(),end=" ")
#---结果---
0 1 2 3 4 

###例子二:后进先出###
import queue
q = queue.LifoQueue()
for i in range(5):
    q.put(i)
for i in range(5):
    print(q.get(),end=" ")
#---结果---
4 3 2 1 0

###例子三:按优先标志位读取###
#参考其它资料,看到许多讲述优先级队列的实现,但是我觉得直接用元组的方式比较简单粗暴。
import queue
p = queue.PriorityQueue()
p.put((3,"3"))
p.put((1,"1"))
p.put((4,"4"))
p.put((2,"2"))

for i in range(3):
    print(p.get())
#---结果:按元组索引0排序---    
(1, '1')
(2, '2')
(3, '3')
(4, '4')
    
    
###例子四:多元组判断###   
import queue

p = queue.PriorityQueue()

p.put((1,4,"a"))
p.put((2,1,"666"))
p.put((1,3,"4"))
p.put((2,2,"2"))


for i in range(3):
    print(p.get())   
#-----结果:元组对应的序号进行比较,主键是序号0,越往后,优先度越低。-----
(1, 3, '4')
(1, 4, 'a')
(2, 1, '666')
(2, 2, '2')

三、队列的常用方法和属性:

 

方法和属性作用
示例
task_done()

1、标记之前的一个任务已经完成。

2、由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。

3、如果当前的join()当前处于阻塞状态,当前的所有元素执行后都会重启(意味着收到加入queue的每一个对象的task_done()调用的信息)

join()

阻塞:

等待队列所有任务执行结束。

当消费者线程调用task_done(),队列中未完成的计数就会减少,直至计数为0,解除阻塞。

put(item,block,timeout)

把对象item放入队列:

item:对象名称,必填项。

block:

    默认是True,如果队列满等待。

    设置成False,如果队列满报Full异常。

timeout:【block为True是生效】

    默认是None,如果队列满了等待。

    0:不等待,队列满了立即报Full。

    正数1~:等待相应秒数,秒数到了,队列还是满的,报错Full。

 

put_nowait(item)向队列里存对象,不等待,如果队列满了,报queue.Full错误
get(block,timeout)

从队列取出对象,并把对象从队列中删除

block:

    默认是True,队列为空等待。

    可以变更为False,如果队列为空,报Empty错误。

timeout:【block为True是生效】

    默认是None,队列为空,等待。

    0:不等待,队列为空直接报Empty。

    正数1~:等待相应秒数,如果依然为空,则报Empty

 

get_nowait()从队列里取对象,不等待,如果队列为空,报queue.Empty错误
qsize()

返回队列长度的近似值。

qsize长度不做为get和put方法的操作依据。

 

empty()

队列为空返回True

不做为get和put方法的操作依据。

 

full()

队列满了返回True

不做为get和put方法的操作依据。

 


四、队列数据进出规则实例 :

            也是一个最简单的生产者消费者例子。


'''例子一:队列基本的进出规则'''


import queue,time,threading,random

def productor(name,s):                        # 生产者函数,向队列里放产品
	time.sleep(s)
	print ('服务员{}有时间了'.fORMat(name))
	q.put(name)

def customer():                               # 消费者函数,从队列里取产品
	s = q.get()
	print ('服务员{}被叫走了'.format(s))


l = []
q = queue.LifoQueue()        # 后进先出,把LifoQueue改成Queue,先进先出。

for i in range(5):
	n = random.randint(1,7)
	t = threading.Thread(target=productor,args=(i,n))    # 生产线程
	l.append(t)
	t.start()

for i in l:
	i.join()
	customer()
	
	
	        
#-----运行结果:因为有Random,所以结果不固定,主要观察消费顺序。------
服务员0有时间了
服务员0被叫走了

服务员1有时间了
服务员1被叫走了

服务员4有时间了
服务员3有时间了
服务员2有时间了

服务员2被叫走了
服务员3被叫走了
服务员4被叫走了

 


参考资料:

Http://python.jobbole.com/87592/

https://www.2cto.com/kf/201608/540910.html

https://www.cnblogs.com/itoGo/p/5635629.html

--结束END--

本文标题: [python模块]队列queue

本文链接: https://www.lsjlt.com/news/190872.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • [python模块]队列queue
    一、队列queue队列queue 多应用在多线程场景,多线程访问共享变量。对于多线程而言,访问共享变量时,队列queue的线程安全的。因为queue使用了一个线程锁(pthread.Lock()),以及三个条件变量(pthread.cond...
    99+
    2023-01-31
    队列 模块 python
  • Python 队列Queue和Prior
    Python的Queue模块适用于多线程编程的FIFO实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个线程可以共用同一个Queue实例。 F...
    99+
    2023-01-31
    队列 Python Prior
  • python消息队列Queue
    实例1:消息队列Queue,不要将文件命名为“queue.py”,否则会报异常“ImportError: cannot import name 'Queue'”#coding=utf-8 from multiprocessing impor...
    99+
    2023-01-31
    队列 消息 python
  • Python -- Queue模块
    学习契机 最近的一个项目中在使用grpc时遇到一个问题,由于client端可多达200,每个端口每10s向grpc server发送一次请求,server端接受client的请求后根据request信息更新数据库,再将数据库和配置文件的某...
    99+
    2023-01-31
    模块 Python Queue
  • Python 队列Queue和PriorityQueue解析
    目录Python 队列Queue和PriorityQueuePython的Queue模块优先级队列PriorityQueue的特点python 实现一个优先级队列pytho...
    99+
    2022-11-11
  • Python队列Queue超详细讲解
    目录queue模块简介queue.Queue(maxsize=0)queue.LifoQueue(maxsize=0)queue.PriorityQueue(maxsize=0)qu...
    99+
    2023-05-16
    Python队列Queue Python Queue
  • ThinkPHP6 think-queue 消息队列(延迟队列)
    安装 composer require topthink/think-queue 配置 配置文件位于 config/queue.php [ 'default'=>'sync' //...
    99+
    2023-09-04
    php 数据库 mysql
  • C++ Queue队列类模版实例详解
    目录1.队列的介绍2.代码实现3.测试运行总结1.队列的介绍 队列的定义 队列(Queue)是一种线性存储结构。它有以下几个特点:按照"先进先出(FIFO, First-I...
    99+
    2022-11-13
  • TP5 queue队列详解
    thinkphp-queue 笔记 前言一 代码示例 1.1 安装 thinkphp-queue1.2 搭建消息队列的存储环境1.3 配置消息队列的驱动1.4 消息的创建与推送1.5 消息的消费与删除1.6 ...
    99+
    2023-08-31
    php
  • think\queue 消息队列
    简介 TP 中使用 think-queue 可以实现普通队列和延迟队列。 think-queue 是thinkphp 官方提供的一个消息队列服务,它支持消息队列的一些基本特性: 消息的发布,获取,执行...
    99+
    2023-09-10
    redis php thinkphp
  • JAVA队列( Queue ) 详解
    队列(Queue)是一种常见的数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在队列中,新元素插入...
    99+
    2023-09-15
    Java
  • python模块学习(queue模块的Q
    学习版本3.5.2 PriorityQueue类和LifoQueue类继承Queue类然后重写了_init、_qsize、_put、_get这四个类的私有方法 Queue:先进先出队列的同步实现,通过双向列表实现的 # Initi...
    99+
    2023-01-31
    模块 python queue
  • Java优先队列 priority queue
    目录1.优先队列概念2.二叉堆(Heap)完全二叉树和满二叉树堆的重要操作1.优先队列概念 优先队列(priority queue)是一种特殊的数据结构。队列中每一个元素都被分配到一...
    99+
    2022-11-12
  • 详解python数据结构之队列Queue
    目录一、前言二、Queue的基本格式三、入队列函数 en_queue四、删除数据函数 de_queue一、前言 队列Queue是一种先进先出(FIFO,First In First ...
    99+
    2022-11-12
  • C++中Queue队列类模版的示例分析
    这篇文章主要介绍C++中Queue队列类模版的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.队列的介绍队列的定义队列(Queue)是一种线性存储结构。它有以下几个特点:按照"先进先出(FIFO,...
    99+
    2023-06-29
  • Python queue模块功能大全
    目录queue模块简介1. Queue(FIFO队列)2. LifoQueue(LIFO队列)3. PriorityQueue(优先级队列)queue模块简介 queue模块是Pyt...
    99+
    2023-05-16
    Python queue模块 Python queue
  • C++中队列queue怎么用
    这篇文章主要讲解了“C++中队列queue怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中队列queue怎么用”吧!一、定义queue是一种容器转换器模板,调用#include&...
    99+
    2023-06-29
  • Python中的优先队列(priority queue)和堆(heap)
    目录队列和优先队列(Priority Queue)堆(heap)简介初始化构建堆堆的插入(节点上浮)堆的删除(节点下浮)堆的应用队列和优先队列(Priority Queue) 队列是...
    99+
    2022-11-11
  • Python线程之线程安全的队列Queue
    目录一、什么是队列?二、队列基操 入队/出队/查队列状态三、Queue是一个线程安全的类一、什么是队列? 像排队一样,从头到尾排成一排,还可以有人继续往后排队,这就是队列。 这里学委...
    99+
    2022-11-13
  • python中的queue队列类型及函数用法
    目录python queue队列类型及函数1.队列的种类2.队列函数python 队列类及其方法1.Python的队列类型2.队列对象(适用Queue、LifoQueue和Prior...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作