队列:queue
queue is especially useful in threaded programming when information must be exchanged safely between multiple threads.
有三种队列模式
- class
queue.
Queue
(maxsize=0) #先入先出
- class
queue.
LifoQueue
(maxsize=0) #last in fisrt out
- class
queue.
PriorityQueue
(maxsize=0) #存储数据时可设置优先级的队列
用法
>>> import queue >>> q=queue.Queue(maxsize=0) #如果maxsize小于0或者等于0表示队列无穷大 >>> q.qsize() 0 >>> q.put("1111") >>> q.qsize() #获得几个槽被占用了 1 >>> q.full() #如果队列的槽没有可利用的,则返回True False >>> q.empty() False >>> q.get() # 将queue中的item取出来 '1111' >>> q.empty() #如果队列的槽里没有item,则返回True True >>>
q.put(block=False) 相当于q.put_nowait()
q.get(block=False) 相当于q.get_nowait()
q.join()
Blocks until all items in the queue have been gotten and processed
q.task_done()
Indicate that a formerly enqueued task is complete. Used by queue consumer threads.
消费者生产者模式
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
import queue import threading q=queue.Queue(maxsize =0) #maxsize设置这个队列一共有无穷大 def producer(): for i in range(10): q.put("骨头%s" %i) #put后面可以接收很多基本的数据类型 print("开始等待所有的骨头被领走") q.join() #阻塞,当get任务全部被完成后才执行join后面的语句 print("骨头被领完了") def consumer(name): while not q.empty(): #如果槽里有东西 print("%s 吃了%s" %(name,q.get())) q.task_done()#告知任务完成,每一个get后面都需要加一个这个,如果程序里有join t= threading.Thread(target=producer) #获得一个线程对象 t.start() #启动线程 consumer('egon')
吃包子的例子
import random,queue,threading import time q=queue.Queue() def producer(name): count = 0 while count < 20: if q.qsize() < 8: time.sleep(random.randrange(2)) q.put(count) print("%s have make %s baozi" %(name,count)) else: print("baozi remain more than 8") count+=1 def consumer(name): count =0 while count < 8: time.sleep(random.randrange(3)) if not q.empty(): data = q.get() time.sleep(0.5) print('