• Python2.7 Queue模块学习


     前面了解了一下threading,发现一般都是和queue模块配合使用的,queue产生一个队列,队列模式有3种,针对这三种队列分别有三个构造函数:

        1 FIFO队列先进先出:class Queue.Queue(maxsize)

        2 LIFO类似于堆,即先进后出:class Queue.LifoQueue(maxsize) 

        3 优先级队列级别越低越先出来:class Queue.PriorityQueue(maxsize)

        队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数, 默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为1。如果队列为空且block为1,get()就使调用线程暂停,直至有项目可用。如果block为0,队列将引发Empty异常。join()保持阻塞状态,直到处理了队列中的所有项目为止。在将一个项目添加到该队列时,未完成的任务的总数就会增加。当使用者线程调用task_done()以表示检索了该项目、并完成了所有的工作时,那么未完成的任务的总数就会减少。当未完成的任务的总数减少到零时,join() 就会结束阻塞状态。

       队列实例分别有以下操作方法:

        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() 在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号 
        Queue.join() 实际上意味着等到队列为空,再执行别的操作

    下面是一个生产者消费者模型,抄的改改代码就可以用了,主要是了解过程。

    #!/usr/bin/python
    import Queue
    import time
    import threading
    
    q=Queue.Queue()
    
    class producer(threading.Thread):
        def __init__(self,i):
            threading.Thread.__init__(self,name="producer Thread-%d" % i)
        def run(self):
            global q
            count=9
            while True:
                for i in range(3):
                    if q.qsize() > 12:
                        pass
                    else:
                        count=count+1
                        msg=str(count)
                        q.put(msg)
                        print self.name+' '+'producer'+msg+' '+'Queue Size:'+str(q.qsize())
                        
                time.sleep(2)
    
    class consumer(threading.Thread):
        def __init__(self,i):
            threading.Thread.__init__(self,name="consumer Thread-%d" % i)
        def run(self):
            global q
            while True:
                for i in range(3):
                    if q.qsize() < 1:
                        pass
                    else:
                        msg=q.get()
                        print self.name+' '+'consumer'+msg+' '+'Queue Size:'+str(q.qsize())
                time.sleep(2)
    
    
    def test():
        for i in range(10):
            q.put(str(i))
            print 'Init producer  '+str(i)
        for i in range(2):
            p=producer(i)
            p.start()
        for i in range(3):
            c=consumer(i)
            c.start()
    
    if __name__ == '__main__':
        test()

    测试图如下:

  • 相关阅读:
    jar包启动的日志管理问题
    docker常用命令-----镜像与容器
    Maven+Nexus私服的搭建
    公允价值变动损益期末处理
    递延所得税资产怎么算
    固定资产转投资性房地产的差额为什么计入其他综合收益
    固定资产转投资性房地产
    固定资产折旧方法
    SublimeText注册码(亲测可用)
    未分配利润和净利润的区别是什么?
  • 原文地址:https://www.cnblogs.com/swyft/p/5542087.html
Copyright © 2020-2023  润新知