zoukankan      html  css  js  c++  java
  • python 队列Queue

    这里的Queue指的是线程中的Queue,后面还有进程间的Queue

    基本FIFO队列:先进先出。

    calss Queue.Queue(maxsize=0)

    maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。

    #coding:utf-8
    import Queue
    q=Queue.Queue(5) #队列中只能存放5个数据
    for i in range(5):
        q.put(i)
    while not q.empty():
        print q.get()
    

    LIFO队列:后进先出

    class Queue.LifoQueue(maxsize=0)

    #coding:utf-8
    import Queue
    q=Queue.LifoQueue(5) #队列中只能存放5个数据
    for i in range(5):
        q.put(i)
    while not q.empty():
        print q.get()
        
    

    结果:

    4
    3
    2
    1
    0

    优先级队列

    class Queue.PriorityQueue(maxsize=0)

    #coding:utf-8
    import Queue
    import threading 
    class Job(object):
        def __init__(self, priority, description):
            self.priority = priority
            self.description = description
            print 'Job:',description
            return
        def __cmp__(self, other):
            return cmp(self.priority, other.priority) 
    q = Queue.PriorityQueue() 
    q.put(Job(3, 'level 3 job'))
    q.put(Job(10, 'level 10 job'))
    q.put(Job(1, 'level 1 job')) 
    def process_job(q):
        while True:
            next_job = q.get()
            print 'for:', next_job.description
            q.task_done() #告诉队列该任务已经处理完毕 
    workers = [threading.Thread(target=process_job, args=(q,)),
            threading.Thread(target=process_job, args=(q,))
            ] 
    for w in workers:
        w.setDaemon(True)  #将主线程设置为守护进程
        w.start() 
    q.join()
    

    常用方法:

    # 先入先出 maxsize 可设置大小,设置block=False抛异常
    class queue.Queue(maxsize=0)  
    
     # 后进先出 
    class queue.LifoQueue(maxsize=0)
    
    # 存储数据时可设置优先级的队列
    # 优先级设置数越小等级越高
    class queue.PriorityQueue(maxsize=0) 
    
    # 放入数据
    Queue.put(item, block=True, timeout=None)
    
    # 取出数据 #没有数据将会等待
    Queue.get(block=True, timeout=None)
    
    # 如果1秒后没取到数据就退出
    Queue.get(timeout = 1)
    
    
    # 取数据,如果没数据抛queue.Empty异常
    Queue.get_nowait()
    
    # 查看队列大小
    Queue.qsize()
    
    # 返回True,如果空
    Queue.empty() #return True if empty  
    
    # 设置队列大小
    Queue.full() 
    
    # 后续调用告诉队列,任务的处理是完整的。
    Queue.task_done()
    

    生产者消费者模型

    #coding:utf-8
    import threading,time
    import queue
    q = queue.Queue(maxsize=10) #定义队列对象
    def Producer(name):
        count = 1
        while True:
            q.put("gu%s" % count)  #放入队列
            print("shenggu",count)
            count +=1
            time.sleep(1)
    def  Consumer(name):
        #while q.qsize()>0:
        while True:
            print("[%s] 取到[%s] 并且吃了它..." %(name, q.get())) #从队列中取出
            time.sleep(1)
    p = threading.Thread(target=Producer,args=("小张",))
    c = threading.Thread(target=Consumer,args=("小王",))
    c1 = threading.Thread(target=Consumer,args=("小李",))
    p.start()
    c.start()
    c1.start()
    
  • 相关阅读:
    关于Windows 2000,IIS 5/4下面,Form内容超过200K解决办法!
    获取客户端网卡MAC地址和IP地址的几种方法
    关于Java的异常捕获
    redis的swap
    Linux下C++程序获取运行时间的一种方式
    CentOS 修改IP地址, DNS, 网关[内容来源网络]
    [转]ubuntu12.04搭建ruby on rails 环境
    rails环境 bundle 时无法安装nokogiri 完美解决
    SQL Server – 冷知识 (新手)
    Typescript – 学习笔记 tsconfig.json
  • 原文地址:https://www.cnblogs.com/iexperience/p/9326279.html
Copyright © 2011-2022 走看看