zoukankan      html  css  js  c++  java
  • Python常用模块之二 Queue

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

    Queue队列的原则时:先进先出,后进后出

    常用方法:

      q.put()

      q.get()

      q.maxsize()

      q.qsize() 返回队列的大小
      q.empty() 如果队列为空,返回True,反之False
      q.full() 如果队列满了,返回True,反之False
      q.full 与 maxsize 大小对应
      q.get([block[, timeout]]) 获取队列,timeout等待时间
      q.get_nowait() 相当q.get(False)
      非阻塞 q.put(item) 写入队列,timeout等待时间
      q.put_nowait(item) 相当q.put(item, False)
      q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
      q.join() 实际上意味着等到队列为空,再执行别的操作

    1.创建队列:

    import Queue
    q = Queue.Queue(maxsize = 10)
    Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

    2.放入数值

    q.put(nub)

     范例:
    实现一个线程不断生成一个随机数到一个队列中(考虑使用Queue这个模块)
    实现一个线程从上面的队列里面不断的取出奇数
    实现另外一个线程从上面的队列里面不断取出偶数

    #!/usr/bin/env python
    #coding:utf8
    import random,threading,time
    from Queue import Queue
    #Producer thread
    class Producer(threading.Thread):
        def __init__(self, t_name, queue):
            threading.Thread.__init__(self,name=t_name)
            self.data=queue
        def run(self):
            for i in range(10):    #随机产生10个数字 ,可以修改为任意大小
                randomnum=random.randint(1,99)
                print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), randomnum)
                self.data.put(randomnum)  #将数据依次存入队列
                time.sleep(1)
            print "%s: %s finished!" %(time.ctime(), self.getName())
     
    #Consumer thread
    class Consumer_even(threading.Thread):
        def __init__(self,t_name,queue):
            threading.Thread.__init__(self,name=t_name)
            self.data=queue
        def run(self):
            while 1:
                try:
                    val_even = self.data.get(1,5)  #get(self, block=True, timeout=None) ,1就是阻塞等待,5是超时5秒
                    if val_even%2==0:
                        print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(),self.getName(),val_even)
                        time.sleep(2)
                    else:
                        self.data.put(val_even)
                        time.sleep(2)
                except:     #等待输入,超过5秒  就报异常
                    print "%s: %s finished!" %(time.ctime(),self.getName())
                    break
    class Consumer_odd(threading.Thread):
        def __init__(self,t_name,queue):
            threading.Thread.__init__(self, name=t_name)
            self.data=queue
        def run(self):
            while 1:
                try:
                    val_odd = self.data.get(1,5)
                    if val_odd%2!=0:
                        print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val_odd)
                        time.sleep(2)
                    else:
                        self.data.put(val_odd)
                        time.sleep(2)
                except:
                    print "%s: %s finished!" % (time.ctime(), self.getName())
                    break
    #Main thread
    def main():
        queue = Queue()
        producer = Producer('Pro.', queue)
        consumer_even = Consumer_even('Con_even.', queue)
        consumer_odd = Consumer_odd('Con_odd.',queue)
        producer.start()
        consumer_even.start()
        consumer_odd.start()
        producer.join()
        consumer_even.join()
        consumer_odd.join()
        print 'All threads terminate!'
     
    if __name__ == '__main__':
        main()
  • 相关阅读:
    HDU 6071
    HDU 6073
    HDU 2124 Repair the Wall(贪心)
    HDU 2037 今年暑假不AC(贪心)
    HDU 1257 最少拦截系统(贪心)
    HDU 1789 Doing Homework again(贪心)
    HDU 1009 FatMouse' Trade(贪心)
    HDU 2216 Game III(BFS)
    HDU 1509 Windows Message Queue(队列)
    HDU 1081 To The Max(动态规划)
  • 原文地址:https://www.cnblogs.com/The-cup/p/4409548.html
Copyright © 2011-2022 走看看