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模块详解相关推荐

  1. python输出命令_Python输出各行命令详解

    创建main.py文件并粘贴下面代码 点击右键运行Debug 'main'后,下方的Debug窗口会出现ImportError: No module named 'bottle'这样的提示,提示导入b ...

  2. python md5加密_Python MD5加密实例详解

    详解Python MD5加密 Python 3下MD5加密 # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待 ...

  3. python random函数_Python随机函数random使用详解

    在python中用于生成随机数的模块是random,在使用前需要import, 下面看下它的用法. 1.random.random random.random()用于生成一个0到1的随机符点数: 0 ...

  4. python 相对导入_Python相对导入机制详解

    Google FEB 26TH, 2015 Python相对导入机制详解 这个答案能解释大多关于 relative import,即相对导入的疑惑,讲解十分详尽清晰,算是 SO 上被低估的一个答案. ...

  5. 简述python文件操作_Python 文件操作的详解及实例

    Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. ...

  6. python 类 实例_Python类的实例详解

    类(class)是一个用户自定义类型,开发者可以将其实例化以获得实例(instance),实例表示这种类型的对象.在Python中,类就是对象,开发者可以像对其他对象那样处理函数,可以在调用函数时传递 ...

  7. python pdb 安装_Python调试工具pdb使用详解

    Python调试工具pdb使用详解 [简介] pdb是Python自带的一个包,为python程序提供了一种交互的源代码调试功能. [使用方法] 1. 使用命令: python -m pdb xxx. ...

  8. python3安装mysql模块_Python安装MySQL库详解,步骤及错误的解决方法

    前面我们介绍的Python网络爬虫通常将抓取的数据存储至TXT或CSV文件,而当数据量增加之时,就需要将其存储至本地数据库了.Python访问数据库需要对应的接口程序,我们可以把接口程序理解为Pyth ...

  9. python init文件_Python __init__.py 作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加 ...

  10. python os 常用方法_python中os常用方法详解

    os的官方解释 os os: This module provides a portable way of using operating system dependent functionality ...

最新文章

  1. VC++读取图像RGB值
  2. php+json对象格式,PHP 创建对象来输出 JSON 格式
  3. Hook的两个小插曲
  4. sigprocmask, sigpending, sigsuspend的用法
  5. 没有安装node对等点依赖_功能依赖项的对等 数据库管理系统
  6. 作者:李俊清,山东农业大学副教授。
  7. Java NIO与IO的差别和比較
  8. 详解Python中的算术乘法、数组乘法与矩阵乘法
  9. python--关于if __name__==__main__的解释
  10. sp_configure
  11. 收到阿里年终奖后,我感觉穷的睡不着,网友:贫穷限制了我的想象力
  12. 音视频基础之YUV格式
  13. 计算机教学提问的观课量表,观课议课|如何使用观察和记录量表
  14. android safe mode
  15. android中如何取得docx文件,如何显示或读取DOCX文件(how to Show or Read docx file)
  16. 用c语言实现窗口化,c怎么窗口化只能开挂吗
  17. 超级表格企业版,最实用的三个功能
  18. 浙工大 drcom客户端 嵌入 Linux路由器
  19. 小提琴统计图_【统计图】如何绘制小提琴图?
  20. CSS 各类选择器 第一节

热门文章

  1. 1.2.2 时间复杂度
  2. c语言switch()语句
  3. 请立即弃用 Notepad++,还有 5 款更牛逼的选择!
  4. 为什么Java中1000==1000为false,而100==100为true?
  5. 在滴滴和头条干了 2 年后端开发,太真实…
  6. Java中设计模式之生产者消费者模式-3
  7. python discuz_python实现的登陆Discuz!论坛通用代码分享
  8. (Java多线程)多线程原理和使用
  9. 杭电1180java实现(bfs)
  10. 双指针算法之滑动窗口 | 力扣76.最小覆盖字串