python 中,队列是线程间最常用的交换数据的形式。queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。

1. 阻塞模式

import queue

q = queue.Queue(10)  #创建一个队列

......
       for i in range(10):
               q.put('A')
               time.sleep(0.5)

这是一段极其简单的代码(另有两个线程也在操作队列q),我期望每隔0.5秒写一个'A'到队列中,但总是不能如愿:间隔时间有时会远远超过0.5秒。原来,Queue.put()默认有 block = True 和 timeou 两个参数。当  block = True 时,写入是阻塞式的,阻塞时间由 timeou  确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常。

2. 无法捕获 exception Queue.Empty 的异常

while True:
                ......
                try:
                        data = q.get()
                except Queue.Empty:
                        break

我的本意是用队列为空时,退出循环,但实际运行起来,却陷入了死循环。这个问题和上面有点类似:Queue.get()默认的也是阻塞方式读取数据,队列为空时,不会抛出 except Queue.Empty ,而是进入阻塞直至超时。 加上block=False 的参数,问题迎刃而解。

3. Queue常用方法汇总

Queue.Queue(maxsize=0)   FIFO, 如果maxsize小于1就表示队列长度无限
       Queue.LifoQueue(maxsize=0)   LIFO, 如果maxsize小于1就表示队列长度无限
       Queue.qsize()   返回队列的大小 
       Queue.empty()   如果队列为空,返回True,反之False 
       Queue.full()   如果队列满了,返回True,反之False
       Queue.get([block[, timeout]])   读队列,timeout等待时间 
       Queue.put(item, [block[, timeout]])   写队列,timeout等待时间 
       Queue.queue.clear()   清空队列

最新文章

  1. Linux 操作mysql数据库 创建库 导入、删除表
  2. winSocket数据传输
  3. Android笔记——Bitmap自动取色(纯搬运)
  4. 黑马程序员 Java正则表达式,详解反斜线在Java中的作用
  5. C#代码控制 zip rar 解压缩
  6. TCP/IP学习笔记__mbuf
  7. JavaScript03-基本概念一
  8. 学习 Spring (十四) Introduction
  9. Python 队列
  10. Vxlan基础理解
  11. 爬虫之Resquests模块的使用(二)
  12. java 静态代理总结
  13. Java的JDK和JRE
  14. SQL Server 2016将内置R语言
  15. pymongo创建索引、更新、删除
  16. notification的创建及应用
  17. Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
  18. PHP中 array_map 与 array_column 之间的关系
  19. 学习HTML5之路
  20. Java基础10-循日历制作

热门文章

  1. 在CentOS上安装ZooKeeper集群
  2. thinkphp学习笔记13-15集
  3. 详细解读PHP时区修改正确方法
  4. highstock 的tooltip框里面的内容 保留两位小数的办法
  5. html5手机常见问题与工具分享
  6. 深入理解计算机系统-从书中看到了异或交换ab两个值的新感
  7. Problem B Boxes in a Line
  8. c#常用的Datable转换为json,以及json转换为DataTable操作方法
  9. MongoDB的基本使用(二)
  10. CSU 1503 点到圆弧的距离(2014湖南省程序设计竞赛A题)