def get():
try:
for i in range(50):
print(q.get(block=False))
except queue.Empty:
print("队列已空,无法取出数据")
def qsize():
# time.sleep(1)
print("此时队列中个数:",q.qsize())
put_thr = threading.Thread(target=put)
get_thr = threading.Thread(target=get)
qsi_thr = threading.Thread(target=qsize)
q = queue.Queue(5) # 队列最多同时容纳5个数据
put_thr.start()
qsi_thr.start()
get_thr.start()
在代码中,有用到异常处理,是因为如果队列满了再存入数据会触发异常,队列空了再取数据也会触发异常。
2. queue.LifoQueue(maxsize=0) 先入后出
方法与上同
3. PriorityQueue() 存储数据时可设置优先级
import queue
import threading
'''
按照优先级取出数据。
'''
q = queue.PriorityQueue() # 生成队列
q.put((5,"lwz"))
q.put((10,"alex"))
q.put((2,"chenronghua")) # 数字越小优先级越高
print(q.get())
print(q.get())
print(q.get())
生产者消费者模型
该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。
为什么要使用生产者和消费者模式?
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。
在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。
同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。
什么是生产者消费者模式?
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,
而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,
而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
import queue
import threading
import time
def Producer():
count = 0
while True:
count += 1
q.put("骨头{0}".format(count))
print("生产了骨头{0}".format(count))
time.sleep(1)
def Customer(name):
while 1:
print("{0}取到并且吃了{1}".format(name,q.get()))
time.sleep(0.1)
if __name__ == "__main__":
q = queue.Queue()
c1 = threading.Thread(target=Customer,args=("alex",))
c2 = threading.Thread(target=Customer,args=("Chen",))
p = threading.Thread(target=Producer)
c1.start()
c2.start()
p.start()
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx