queue模块实现了多生产者。多消费者队列。在多线程环境下,该队列能实现多个线程间安全的信息交换。

queue模块介绍

模块实现了3种类型的队列,差别在于队列中条目检索的顺序不同。

在FIFO队列中。依照先进先出的顺序检索条目。在LIFO队列中,最后加入的条目最先检索到(操作类似一个栈)。在优先级队列中,条目被保存为有序的(使用heapq模块)而且最小值的条目被最先检索。

queue模块定义了以下的类和异常:

class queue.Queue(maxsize=0)

FIFO队列的构造器。maxsize为一个整数。表示队列的最大条目数。一旦队列满,插入将被堵塞直到队列中存在空暇空间。假设maxsize小于等于0。队列大小为无限。

class queue.LifoQueue(maxsize=0)

LIFO队列的构造器。

maxsize是一个整数,表示队列的最大条目数。一旦队列满,插入将被堵塞直到队列中存在空暇空间。假设maxsize小于等于0,队列大小为无限。

class queue.PriorityQueue(maxsize=0)

优先级队列的构造器。maxsize是一个整数,表示队列的最大条目数。一旦队列满,插入将被堵塞直到队列中存在空暇空间。

假设maxsize小于等于0,队列大小为无限。

最小值的条目被最先检索到(最小值的条目即为被sorted(list(entries))[0]返回的条目)。

通常一个条目被保存为以下的形式:(priority_number, data)。

exception queue.Empty

当Queue为空时,非堵塞的get()或者get_nowait()被调用时,将抛出该异常。

exception queue.Full

当队列满时,非堵塞的put()或者put_nowait()被调用,将抛出该异常。

Queue对象

Queue对象(Queue、LifoQueue或者PriorityQueue)提供了下面方法:

Queue.qsize()
返回队列的近似大小。注意,qsize() > 0并不能保证接下来的get()方法不被堵塞。相同。qsize() < maxsize也不能保证put()将不被堵塞。

Queue.empty()
假设队列是空的。则返回True,否则False。假设empty()返回True,并不能保证接下来的put()调用将不被堵塞。类似的。empty()返回False也不能保证接下来的get()调用将不被堵塞。

Queue.full()
假设队列满则返回True,否则返回False。假设full()返回True,并不能保证接下来的get()调用将不被堵塞。

类似的,full()返回False也不能保证接下来的put()调用将不被堵塞。

Queue.put(item, block=True, timeout=None)
放item到队列中。假设block是True,且timeout是None。该方法将一直等待直到有队列有空余空间。假设timeout是一个正整数,该方法则最多堵塞timeout秒并抛出Full异常。假设block是False而且队列满,则直接抛出Full异常(这时timeout将被忽略)。

Queue.put_nowait(item)
等价于put(item, False)。

Queue.get(block=True, timeout=None)
从队列中移除被返回一个条目。假设block是True而且timeout是None,该方法将堵塞直到队列中有条目可用。假设timeout是正整数,该方法将最多堵塞timeout秒并抛出Empty异常。假设block是False而且队列为空。则直接抛出Empty异常(这时timeout将被忽略)。

Queue.get_nowait()
等价于get(False)。

假设须要跟踪进入队列中的任务是否已经被精灵消费者线程处理完毕,能够使用以下提供的两个方法:

Queue.task_done()
表示一个先前的队列中的任务完毕了。被队列消费者线程使用。对于每一个get()获取到的任务,接下来的task_done()的调用告诉队列该任务的处理已经完毕。

假设join()调用正在堵塞,当队列中全部的条目被处理后它将恢复运行(意味着task_done()调用将被放入队列中的每一个条目接收到)。

假设调用次数超过了队列中放置的条目数目,将抛出ValueError异常。

Queue.join()
堵塞直到队列中全部条目都被获取并处理。
当一个条目被添加到队列时,未完毕任务的计数将添加。当一个消费者线程调用task_done()时,未完毕任务的计数将降低。

当未完毕任务的计数降低到0时,join()解锁。

以下是一个详细的样例。用于说明怎么等待队列任务完毕:

def worker():while True:item = q.get()do_work(item)q.task_done()q = Queue()
for i in range(num_worker_threads):t = Thread(target=worker)t.daemon = Truet.start()for item in source():q.put(item)q.join()       # 堵塞直到全部任务完毕

转载于:https://www.cnblogs.com/jzdwajue/p/7028909.html

Python多线程3:queue相关推荐

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

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

  2. Python多线程——队列(Queue)

    一. Queue作用:主要就是为多线程生产值.消费者之间线程通信提供服务,具有先进先出的数据结构. 1.首先我们组要明白为什么要使用队列,队列的性质, 多线程并发编程的重点,是线程之间共享数据的访问问 ...

  3. python 多线程及线程间通信

    python 多线程 import threading import time def run(n):print("task", n)time.sleep(1)print('2s' ...

  4. python多线程的几种方法

    python多线程编程 Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程 ...

  5. python多线程输出_Python多线程

    多线程基础概念 并行与并发 并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段 线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允 ...

  6. python多线程爬虫实例-Python实现多线程爬虫

    编辑推荐: 本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助. 本文来知乎,由火龙果软件Alice编辑,推荐. 最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的 ...

  7. python多线程爬虫实例-Python3多线程爬虫实例讲解代码

    多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点, ...

  8. python多线程爬虫实例-Python多线程爬虫简单示例

    python是支持多线程的,主要是通过thread和threading这两个模块来实现的.thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用. ...

  9. Python多线程学习

    一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: ...

  10. 2021-03-10 Python多线程爬虫快速批量下载图片

    Python多线程爬虫快速批量下载图片 1.完成这个需要导入的模块 urllib,random,queue(队列),threading,time,os,json 第三方模块的安装 键盘win+R,输入 ...

最新文章

  1. ping 原理与ICMP协议
  2. mysql sp cursoropen_三个重要的游标sp_cursoropen_MySQL
  3. 项目: 用Easyx绘制围棋和象棋的棋盘
  4. C语言 · 比较字符串
  5. Android 返回桌面
  6. elementary OS下netbeans中文乱码的问题
  7. 社会对IT 从业人员综合素质的需求
  8. lintcode :Count and Say 报数
  9. ssh登录很慢,登录上去后速度正常问题的解决方法
  10. 开源跨平台GUI库Fltk在Deepin Linux下的使用
  11. linux玩游戏无声音,Linux下LumaQQ 无声音的解决方法与播放电影
  12. Windows系统批量创建文件夹的技巧
  13. 松江区企业技术中心认定条件及奖励政策解读
  14. TVS与ESD的区别
  15. 计算机音乐制作专业的大学,音乐制作专业哪些大学
  16. 音视频:AVAudioPlayer:中断处理
  17. Legendshop工时记录系统
  18. Python学习案例2——数独解题及出题程序
  19. 《名贤集》《明贤集》四言集
  20. 手指头肌腱损伤鸿蒙训练,手指肌腱损伤恢复方法有哪些

热门文章

  1. python linux编程与window编程_Python3如何在Windows和Linux上打包
  2. 深度学习(6)TensorFlow基础操作二: 创建Tensor
  3. 学了C++不会STL,简直少了左膀右臂
  4. 诺贝尔化学奖得主田中耕一的故事
  5. python set()函数讲解
  6. 如何在不亏本的情况下构建道德数据科学系统?
  7. 夫妻两一个两年内3张卡9次逾期,一人4次,还能办理房贷吗?
  8. linux禁止系统休眠,让linux系统休眠
  9. qprocess回调_QT进程间通信详细介绍及QProcess机制分析
  10. sql 中位数_【PL/SQL 自定义函数】 常用场景