python queue模块_Python的queue模块详解
Queue
Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递
基本FIFO队列
class Queue.Queue(maxsize=0)
FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。
举个栗子:
1 import Queue2 3 q = Queue.Queue()4 5 for i in range(5):6 q.put(i)7 8 while not q.empty():9 print q.get()
输出:
01
2
3
4
LIFO队列
class Queue.LifoQueue(maxsize=0)
LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上
再举个栗子:
1 import Queue2 3 q = Queue.LifoQueue()4 5 for i in range(5):6 q.put(i)7 8 while not q.empty():9 print q.get()
输出:
4
3
2
10
可以看到仅仅是将Queue.Quenu类替换为Queue.LifiQueue类
优先级队列
class Queue.PriorityQueue(maxsize=0)
构造一个优先队列。maxsize用法同上。
import Queueimport threadingclass Job(object):def __init__(self, priority, description):
self.priority = priority
self.description = descriptionprint 'Job:',descriptionreturndef __cmp__(self, other):return cmp(self.priority, other.priority)
q = Queue.PriorityQueue()
q.put(Job(3, 'level 3 job'))
q.put(Job(10, 'level 10 job'))
q.put(Job(1, 'level 1 job'))def process_job(q):while True:
next_job = q.get()print 'for:', next_job.description
q.task_done()
workers = [threading.Thread(target=process_job, args=(q,)),
threading.Thread(target=process_job, args=(q,))
]for w in workers:
w.setDaemon(True)
w.start()
q.join()
结果
Job: level 3 job
Job: level 10 job
Job: level 1 jobfor: level 1 jobfor: level 3 jobfor: job: level 10 job
一些常用方法
task_done()
意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。
如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。
join()
阻塞调用线程,直到队列中的所有任务被处理掉。
只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。
put(item[, block[, timeout]])
将item放入队列中。如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。
如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。
如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常
其非阻塞版本为put_nowait等同于put(item, False)
get([block[, timeout]])
从队列中移除并返回一个数据。block跟timeout参数同put方法
其非阻塞方法为`get_nowait()`相当与get(False)
empty()
如果队列为空,返回True,反之返回False
python queue模块_Python的queue模块详解相关推荐
- python输出命令_Python输出各行命令详解
创建main.py文件并粘贴下面代码 点击右键运行Debug 'main'后,下方的Debug窗口会出现ImportError: No module named 'bottle'这样的提示,提示导入b ...
- python md5加密_Python MD5加密实例详解
详解Python MD5加密 Python 3下MD5加密 # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待 ...
- python random函数_Python随机函数random使用详解
在python中用于生成随机数的模块是random,在使用前需要import, 下面看下它的用法. 1.random.random random.random()用于生成一个0到1的随机符点数: 0 ...
- python 相对导入_Python相对导入机制详解
Google FEB 26TH, 2015 Python相对导入机制详解 这个答案能解释大多关于 relative import,即相对导入的疑惑,讲解十分详尽清晰,算是 SO 上被低估的一个答案. ...
- 简述python文件操作_Python 文件操作的详解及实例
Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. ...
- python 类 实例_Python类的实例详解
类(class)是一个用户自定义类型,开发者可以将其实例化以获得实例(instance),实例表示这种类型的对象.在Python中,类就是对象,开发者可以像对其他对象那样处理函数,可以在调用函数时传递 ...
- python pdb 安装_Python调试工具pdb使用详解
Python调试工具pdb使用详解 [简介] pdb是Python自带的一个包,为python程序提供了一种交互的源代码调试功能. [使用方法] 1. 使用命令: python -m pdb xxx. ...
- python3安装mysql模块_Python安装MySQL库详解,步骤及错误的解决方法
前面我们介绍的Python网络爬虫通常将抓取的数据存储至TXT或CSV文件,而当数据量增加之时,就需要将其存储至本地数据库了.Python访问数据库需要对应的接口程序,我们可以把接口程序理解为Pyth ...
- python init文件_Python __init__.py 作用详解
__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加 ...
- python os 常用方法_python中os常用方法详解
os的官方解释 os os: This module provides a portable way of using operating system dependent functionality ...
最新文章
- VC++读取图像RGB值
- php+json对象格式,PHP 创建对象来输出 JSON 格式
- Hook的两个小插曲
- sigprocmask, sigpending, sigsuspend的用法
- 没有安装node对等点依赖_功能依赖项的对等 数据库管理系统
- 作者:李俊清,山东农业大学副教授。
- Java NIO与IO的差别和比較
- 详解Python中的算术乘法、数组乘法与矩阵乘法
- python--关于if __name__==__main__的解释
- sp_configure
- 收到阿里年终奖后,我感觉穷的睡不着,网友:贫穷限制了我的想象力
- 音视频基础之YUV格式
- 计算机教学提问的观课量表,观课议课|如何使用观察和记录量表
- android safe mode
- android中如何取得docx文件,如何显示或读取DOCX文件(how to Show or Read docx file)
- 用c语言实现窗口化,c怎么窗口化只能开挂吗
- 超级表格企业版,最实用的三个功能
- 浙工大 drcom客户端 嵌入 Linux路由器
- 小提琴统计图_【统计图】如何绘制小提琴图?
- CSS 各类选择器 第一节
热门文章
- 1.2.2 时间复杂度
- c语言switch()语句
- 请立即弃用 Notepad++,还有 5 款更牛逼的选择!
- 为什么Java中1000==1000为false,而100==100为true?
- 在滴滴和头条干了 2 年后端开发,太真实…
- Java中设计模式之生产者消费者模式-3
- python discuz_python实现的登陆Discuz!论坛通用代码分享
- (Java多线程)多线程原理和使用
- 杭电1180java实现(bfs)
- 双指针算法之滑动窗口 | 力扣76.最小覆盖字串