from queue import Queue
import time,random,threading
def xiaofei(name,q):
while True:
s=q.get()
print('%s消费了%s'%(name,s))
time.sleep(random.random())
q.task_done() #取完一个数据向生产者发送一个信号,当取完时生产者线程解阻塞
def shengchan(name,q):
for i in range(3):
q.put(i)
print('%s生产了%s'%(name,i))
time.sleep(random.random())
q.join() #根据生产者发送的信号判断队列中元素个数,取完时解阻塞
if __name__ == '__main__':
q = Queue()
t1 = threading.Thread(target=xiaofei, args=('消费者', q))
t2 = threading.Thread(target=shengchan, args=('生产者', q))
t1.daemon = True #将子线程t1的daemon设置为Ture,主线程结束不会等待这个子线程
print('主线程')
t1.start()
t2.start()
在上一次的模型中主线程守护子线程,消费者线程取完生产者生产的数据后一直处于阻塞状态。主线程一直等待不能结束。现在将消费者线程的daemon属性改为True,也就是主线程结束了就不用等待消费者子线程结束。消费者还没有取完数据时生产者线程一直阻塞,而主线程还是会等待生产者线程的,等到消费者线程取完数据后告诉生产者,生产者得到消息后去阻塞结束线程,主线程强行结束消费者子线程。