day52-线程-队列

#1、线程的队列是使用import queue,如果使用from threading import Queue会报错,因为threading模块没有Queue。
#也就是说,线程队列Queue是在queue模块里面,不在threading模块里面。
import queue
q = queue.Queue()
q.put(1)
print(q.get())

#2、LifoQueue:后进先出队列
import queue
q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
# 3
# 2
# 1

#3、PriorityQueue:优先级队列:值越小越优先,值相同就先进先出。
import queue
q = queue.PriorityQueue()
q.put((3,'c'))
q.put((1,'a'))
q.put((1,'b'))
q.put((4,'d'))
print(q.get())
print(q.get())
print(q.get())
print(q.get())
# (1, 'a')
# (1, 'b')
# (3, 'c')
# (4, 'd')

#生产者和消费者模型:
# 4、queue模块里面有Queue这个类,Queue里面有task_done和join方法。
# 通过下列方法让消费者线程结束:
# 因为生产者put100个包子,而消费者get100个包子之后,消费者就吃完包子了,通过q.task_done()发信号给-->生产者,
# q.join()接收信号之后不再阻塞,生产者线程结束-->
# -->接着主线程t1.join()的意思是主线程随着生产者t1子线程的结束而结束-->最后消费者守护线程t2.setDaemon(True)随着主线程的结束而结束。 import queue from threading import Thread import time def producer(q): for i in range(100): q.put('包子%s' % i) q.join() def consumer(q, i): while True: print('消费者%s吃到%s' % (i, q.get())) q.task_done() q = queue.Queue(10) t1 = Thread(target=producer, args=(q,)) t1.start() for i in range(5): t2 = Thread(target=consumer, args=(q, i)) t2.setDaemon(True) t2.start() t1.join() #task_done方法在进程multiprocessing模块的JoinableQueue类里面,在线程queue模块的Queue类里面。
原文地址:https://www.cnblogs.com/python-daxiong/p/12142809.html