Queue

Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递

基本FIFO队列

class Queue.Queue(maxsize=0)

FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。

举个栗子:

import Queueq = Queue.Queue()for i in range(5):q.put(i)while not q.empty():print q.get()

输出:

0
1
2
3
4

LIFO队列

class Queue.LifoQueue(maxsize=0)

LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上

再举个栗子:

import Queueq = Queue.LifoQueue()for i in range(5):q.put(i)while not q.empty():print q.get()

输出:

4
3
2
1
0

可以看到仅仅是将Queue.Quenu类替换为Queue.LifiQueue类

优先级队列

class Queue.PriorityQueue(maxsize=0)

构造一个优先队列。maxsize用法同上。

import Queue
import threadingclass Job(object):def __init__(self, priority, description):self.priority = priorityself.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.descriptionq.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 job
for: level 1 job
for: level 3 job
for: job: level 10 job

一些常用方法

task_done()

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

如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。

join()

阻塞调用线程,直到队列中的所有任务被处理掉。

只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。

put(item[, block[, timeout]])

将item放入队列中。

  1. 如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。
  2. 如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。
  3. 如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常

其非阻塞版本为put_nowait等同于put(item, False)

get([block[, timeout]])

从队列中移除并返回一个数据。block跟timeout参数同put方法

其非阻塞方法为`get_nowait()`相当与get(False)

empty()

如果队列为空,返回True,反之返回False

queue.queue是什么相关推荐

  1. queue.Queue和multiprocessing.Queue队列的区别

    queue.Queue和multiprocessing.Queue队列的区别 文章目录 queue.Queue和multiprocessing.Queue队列的区别 前言 一.明显的区别 二.queu ...

  2. Queue.queue 退出与阻塞

    Queue.queue 退出与阻塞 ''python #-*-coding:utf-8-*- import threading import queue import time import rand ...

  3. Python: queue.Queue

    Queue官方文档介绍网址: https://docs.python.org/2/library/queue.html 1. Queue class Queue.Queue(maxsize=0):FI ...

  4. python queue get 方法_为什么Python的queue.Queue.get()允许从超时中提前返回?

    更新:这个问题基于Queue.get()实际行为的错误心智模型,这是由一些略微模糊的文档引起的,但主要是由timedelta.total_seconds()的错误的手动实现引起的.当我试图证明原始答案 ...

  5. python中queue.Queue task_done

    Queue.task_done() 与 Queue.join() 使用queue一般用于在线程间传递数据,通过queue.put()与queue.get()来获取任务数据,通常需要在任务执行完成之后进 ...

  6. Python 标准库之 Queue

    1. Queue 概念 队列 Queue 多应用在多线程应用中,多线程访问共享变量.对于多线程而言,访问共享变量时,队列 Queue 是线程安全的. Python Queue 模块有三种队列及构造函数 ...

  7. Python多线程(3)——Queue模块

    Python多线程(3)--Queue模块 Queue模块支持先进先出(FIFO)队列,支持多线程的访问,包括一个主要的类型(Queue)和两个异常类(exception classes). Pyth ...

  8. C++ STL:stack和queue

    http://blog.csdn.net/wallwind/article/details/6858634 http://blog.csdn.net/chao_xun/article/details/ ...

  9. C++/C++11中std::queue的使用

    std::queue: 模板类queue定义在<queue>头文件中.队列(Queue)是一个容器适配器(Container adaptor)类型,被特别设计用来运行于FIFO(First ...

最新文章

  1. 【BZOJ】1667: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛
  2. C++单链表学习随想
  3. 高人写的浙大简史(转)
  4. 博士笔记 | 周志华《机器学习》手推笔记第二章-模型评估与选择
  5. .mvn 需要放git上吗_汽车行李架上可以放东西吗?放了东西可以跑高速吗?
  6. 【kafka】kafka 消费速度 小于 日志清理速度 (kafka数据被清理了)会发生什么 auto.offset.reset 参数
  7. 性能测试--JMeter性能测试工具(简介,环境搭建,环境变量,基本按钮等基本介绍)【2】
  8. lldp协议代码阅读_软件实现LLDP协议HaneWin LLDP Service
  9. 当数据库新增字段后,接下来需要做的操作(备忘录)
  10. Golang 协程 跟Java NIO
  11. 关于文章关键字词云的生成
  12. 伦斯勒理工大学计算机专业好申请吗,伦斯勒理工学院申请条件
  13. 华为、华三交换机查看光模块收发光及光模块信息
  14. 宽带和下载速度(下载速率)之间的区别
  15. 天津大学计算机学院杜朴风,开源技术及应用-天津大学计算机学院.PPT
  16. android studio 显示view树_Android手势分发和嵌套滚动机制
  17. 前缀树——以Gin路由为例
  18. Rabbit MQ的基本使用
  19. C和C++混合编程(error C2059: syntax error : 'string')
  20. ORACLE中的全连接(Full Join)、内连接(JOIN/INNER JOIN)、左连接(Left Join)、右连接(Left Join)、(+)符号以及Theta连接

热门文章

  1. FME对CAD扩展属性的读写
  2. MySQL中如何定义一个自己写的函数
  3. 6410同时支持colorkey和aphablend
  4. javaweb开发和j2ee区别
  5. week1:History: Dawn of Electronic Computing
  6. 专访深职院XR专家 | 实时云渲染赋能虚拟仿真实训,打造5G+XR智慧教育平台
  7. sql文件导入mysql数据库出错_如何解决navicat导入sql文件出错的问题
  8. LibreCAD+Mingw编译记录
  9. yum-utils与yum-config-manager
  10. 你的Idea还可用吗?不妨试试另一个开发神器!