zoukankan      html  css  js  c++  java
  • python多线程编程之Queue---put/get 方法的阻塞

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

    1. 阻塞模式导致数据污染

    import Queue
           q = Queue.Queue(10)
           for in range(10):
                   myData = 'A'
                   q.put(myData)
                   myData = 'B'

    这是一段极其简单的代码,但我总是不能获得期望的结果(期望在队列中写入10个A,却总是混杂了B)。原来,Queue.put()默认有 block = True 和 timeou 两个参数。当  block = True 时,写入是阻塞式的,阻塞时间由 timeou  确定。正因为阻塞,才导致了后来的赋值污染了处于阻塞状态的数据。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()   清空队列

  • 相关阅读:
    通过代码去执行testNG用例
    启动jenkins服务错误
    linux 添加用户到sudo中
    通过jenkins API去build一个job
    iptables
    比较git commit 两个版本之间次数
    linux awk命令详解
    cron和crontab
    工作随笔——CentOS6.4支持rz sz操作
    Jenkins进阶系列之——15Maven获取Jenkins的Subversion的版本号
  • 原文地址:https://www.cnblogs.com/wuxinqiu/p/3862654.html
Copyright © 2011-2022 走看看