线程队列Queue
- 官方文档:https://docs.python.org/zh-cn/3.6/library/queue.html
- 参考博客:https://blog.csdn.net/weixin_43533825/article/details/89155648
Queue方法:
Queue.qsize() :返回队列的大小
Queue.empty() :如果队列为空,返回True,反之False
Queue.full() :如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
Queue.get([block[, timeout]]):获取队列,timeout等待时间
Queue.get_nowait() :相当于Queue.get(False),非阻塞方法
Queue.put(item) :写入队列,timeout等待时间
Queue.task_done() :在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done():调用告诉队列该任务已经处理完毕。
Queue.join() :实际上意味着等到队列为空,再执行别的操作
生产者消费着模型
# queue默认线程安全
import threading
import time
# Python2
# from Queue import Queue
# Python3
import threading
import time
import queue
lock =threading.Lock()
count = 0
class Producer(threading.Thread):
def run(self):
global count
while True:
# qsize返回queue内容长度
if queue.qsize() < 1000:
for i in range(100):
count = count +1
msg = self.name + '生成了产品'+str(count)
# put是网queue中放入一个值
queue.put(msg)
print(msg)
time.sleep(0.5)
class Consumer(threading.Thread):
def run(self):
global queue
while True:
if queue.qsize() > 20:
for i in range(3):
# get是从queue中取出一个值
msg = self.name + '消费了'+ queue.get()
print(msg)
time.sleep(1)
if __name__ == '__main__':
queue = queue.Queue()
for i in range(200):
queue.put('初始化产品'+str(i))
for i in range(2):
p = Producer()
p.start()
for i in range(5):
c = Consumer()
c.start()