zoukankan      html  css  js  c++  java
  • Python自动化之线程进阶篇(二)

    queue队列

    class queue.Queue(maxsize=0) #先入先出
    class queue.LifoQueue(maxsize=0) #后入先出
    class queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列

    queue.PriorityQueue 优先级案例一(使用数值进行优先级排序,数值越小优先级越高)

    import Queue
    
    class PriorityQueue(Queue.Queue):
        def _put(self, item):
            data, priority = item
            self._insort_right((priority, data))
    
        def _get(self):
            return self.queue.pop(0)[1]
    
        def _insort_right(self, x):
            """Insert item x in list, and keep it sorted assuming a is sorted.
    
            If x is already in list, insert it to the right of the rightmost x.       
            """
            a = self.queue
            lo = 0        
            hi = len(a)
    
            while lo < hi:
                mid = (lo+hi)/2
                if x[0] < a[mid][0]: hi = mid
                else: lo = mid+1
            a.insert(lo, x)
    
    def test():
        pq = PriorityQueue()
    
        pq.put(('b', 1))
        pq.put(('a', 1))
        pq.put(('c', 1))
        pq.put(('z', 0))
        pq.put(('d', 2))
    
        while not pq.empty():
            print pq.get(),   
    
    test() 
    

    重写PriorityQueue类

    执行结果

    d
    c
    a
    b
    z

    使用heapq实现优先级队列

    # coding=utf-8
    from heapq import heappush, heappop
    
    
    class PriorityQueue:
        def __init__(self):
            self._queue = []
    
        def put(self, item, priority):
            heappush(self._queue, (-priority, item))
            print(self._queue)
    
        def get(self):
            # print(heappop(self._queue),"---")
            return heappop(self._queue)[-1] #返回堆里面最小的值
    
    
    q = PriorityQueue()
    q.put('world', 1)
    q.put('hello', 2)
    print(q.get())
    print(q.get())
    

    结果

    [(-1, 'world')]
    [(-2, 'hello'), (-1, 'world')]
    hello
    world

    queue的用法
    Queue.qsize()
    返回队列的近似大小。注意,qsize() > 0并不能保证接下来的get()方法不被阻塞;同样,qsize() < maxsize也不能保证put()将不被阻塞。

    Queue.empty()
    如果队列是空的,则返回True,否则False。如果empty()返回True,并不能保证接下来的put()调用将不被阻塞。类似的,empty()返回False也不能保证接下来的get()调用将不被阻塞。

    Queue.full()
    如果队列满则返回True,否则返回False。如果full()返回True,并不能保证接下来的get()调用将不被阻塞。类似的,full()返回False也不能保证接下来的put()调用将不被阻塞。

    Queue.put(item, block=True, timeout=None)
    放item到队列中。如果block是True,且timeout是None,该方法将一直等待直到有队列有空余空间。如果timeout是一个正整数,该方法则最多阻塞timeout秒并抛出Full异常。如果block是False并且队列满,则直接抛出Full异常(这时timeout将被忽略)。

    Queue.put_nowait(item)
    等价于put(item, False)。

    Queue.get(block=True, timeout=None)
    从队列中移除被返回一个条目。如果block是True并且timeout是None,该方法将阻塞直到队列中有条目可用。如果timeout是正整数,该方法将最多阻塞timeout秒并抛出Empty异常。如果block是False并且队列为空,则直接抛出Empty异常(这时timeout将被忽略)。

    Queue.get_nowait()
    等价于get(False)。

    如果需要跟踪进入队列中的任务是否已经被精灵消费者线程处理完成,可以使用下面提供的两个方法:

    Queue.task_done()
    表示一个先前的队列中的任务完成了。被队列消费者线程使用。对于每个get()获取到的任务,接下来的task_done()的调用告诉队列该任务的处理已经完成。
    如果join()调用正在阻塞,当队列中所有的条目被处理后它将恢复执行(意味着task_done()调用将被放入队列中的每个条目接收到)。
    如果调用次数超过了队列中放置的条目数目,将抛出ValueError异常。

    Queue.join()
    阻塞直到队列中所有条目都被获取并处理。

  • 相关阅读:
    积跬步,聚小流------关于UML类图
    深度学习 Deep Learning UFLDL 最新 Tutorial 学习笔记 1:Linear Regression
    数字语音信号处理学习笔记——语音信号的短时频域分析(2)
    PHP程序猿必须学习的第二课——站点安全问题预防
    Connection for controluser as defined in your configuration failed.
    NYOJ 76 超级台阶
    单片机小白学步系列(十) 单片机程序下载相关知识
    SQL 语言划分
    UVA 11754
    客户端远程方法声明
  • 原文地址:https://www.cnblogs.com/wspblog/p/5953624.html
Copyright © 2011-2022 走看看