Python公开课 - 标准库queue基本使用

前言

在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性。

基本介绍

Python标准库中的queue模块实现了多生产者,多消费者队列。

当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。Queue模块中的类实现了所有必需的锁定语义。

这取决于Python中线程支持的可用性; 看threading 模块。

该模块实现了三种类型的队列,它们的区别仅在于取条目的顺序。

  • FIFO 队列,即先进先出队列,添加的第一个条目是第一个取出的条目
  • LIFO队列中,最近添加的条目是第一个取出的(像堆栈一样运行)
  • 使用优先级队列,条目将保持排序(使用heapq模块),并首先检索最低值的条目

构造三种队列

在Python中,可以通过以下方式构造上述三种队列

  1. Python queue模块的FIFO队列先进先出。 class queue.Queue(maxsize)
  2. LIFO类似于堆,即先进后出。 class queue.LifoQueue(maxsize)
  3. 优先级队列级别越低越先出来。 class queue.PriorityQueue(maxsize)

queue模块中的常用方法

  • queue.qsize() 返回队列的大致大小,并非精准
  • queue.empty() 如果队列为空,返回True,反之False
  • queue.full() 如果队列满了,返回True,反之False,注意queue.full 与 maxsize 大小对应
  • queue.get([block[, timeout]])获取队列,timeout等待时间
  • queue.get_nowait() 相当queue.get(False)
  • queue.put(item) 将条目写入队列,timeout等待时间
  • queue.put_nowait(item) 相当queue.put(item, False)
  • queue.task_done() 表示以前排队的任务已完成。由队列使用者线程使用。对于每个get()用于获取任务的人,后续调用 task_done()告诉队列任务的当前条目处理完成。
  • queue.join() 实际上意味着等到队列为空,再执行别的操作

示例说明

import queue
import threading

def worker():
    while True:
        item = q.get()
        if item is None:
            break
        #do_work(item)
        print(item)
        q.task_done()

num_worker_threads=3
q = queue.Queue()
threads = []
for i in range(num_worker_threads):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)

for item in range(10):
    q.put(item)

# block until all tasks are done
print ('wating_process')
q.join()
print ('queue_done')

# stop workers
for i in range(num_worker_threads):
    q.put(None)
for t in threads:
    t.join()
print ('exit')

相关主题:
相关推荐
  1. Python公开课 - 标准库Thread详解
  2. 哼哼猪的大衣
  3. 奥迪客户不满加价,被武汉4S店销售群殴
  4. 蚂蚁小黑豆儿
  5. Python公开课 - 多进程使用
  6. 武汉市东西湖区手拉手幼儿园 - 武汉幼儿园黄页
  7. 易中天给英雄武汉的一首诗 - 武汉新鲜事
  8. 广州市海珠区桂田怡童幼儿园(原格林幼儿园) - 广州幼儿园黄页
  9. 王导平乱
  10. 百名网媒总编辑登上知音号欣赏武汉夜色
  11. 狗和公鸡和狐狸
  12. Ubuntu中如何安装pip3
  13. HashMap底层结构与JVM内存模型 - 阿里技术面试
  14. Python公开课 - Django配置极验证geetest教程
  15. 广州市荔湾区精博中英文小学
  16. 石家庄国泰街小学
  17. 佛山市顺德区勒流中心小学
  18. 上海市第二师范学校附属小学(上海二师附小)
  19. 深圳市六约学校小学部
  20. 武汉00后大二学妹拍视频月入七十万
  21. 上海长宁区北新泾第二小学
  22. 北京市朝阳区首都国际机场第三幼儿园 - 北京幼儿园黄页
  23. 守株待兔的故事由来
  24. 武汉一女子七天被骗220万
  25. 武汉市黄陂区大潭幼儿园 - 武汉幼儿园黄页
  26. 广州市白云区钟落潭镇五龙岗村幼儿园 - 广州幼儿园黄页
  27. 事发武汉农夫山泉矿泉水内惊现大量虫卵
  28. 亲情树幼稚园 - 成都市幼儿园黄页
  29. 上海市徐汇区建襄小学
  30. 多活容灾解决方案
  31. 央媒聚焦!国庆假期173.78万人次打卡大美黄陂
  32. 警方通报:武汉男子持刀至五死一伤,嫌犯已跳桥
  33. 武汉动物园火烈鸟孔雀排队打疫苗
  34. 武汉市江夏区大花岭幼儿园 - 武汉幼儿园黄页
  35. 济南市杨庄小学
  36. 两只小熊
  37. Nginx Location 匹配设置
  38. 喜鹊道歉
  39. 桂林市荔浦县喜洋洋双语幼儿园 - 桂林幼儿园黄页
  40. Python公开课 - Django自定义404/404/500页面的两种方法
  41. 南宋的拆迁补偿
  42. 桂林市阳朔县小天才幼儿园 - 桂林幼儿园黄页
  43. 黄昏的向日葵
  44. 广州市白云区沙龙小学
  45. 赶鸭子上架
  46. 上海市奉贤区博雅幼儿园 - 上海幼儿园黄页
  47. Python公开课 - 爬虫介绍
  48. ubuntu环境安装opencv与python-opencv
  49. 上海交通大学附属小学
  50. 脱单!武汉的相亲角在哪你知道吗?