1.什么是队列?
队列(queue),是先进先出(FIFO, First-In-First-Out)的线性表,
在具体应用中通常用链表或者数组来实现,
队列只允许在后端(称为rear)进行插入操作,
在前端(称为front)进行删除操作,
队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ed850335f01a213d297b1cfb0bb622d6.png)
2.队列操作
我们经常会遇到这样的一个问题,这里有成千上万条数据,
每次需要取出其中的一条数据进行处理,
那么引入多线程该怎么进行任务分配?
我们可以将数据进行分割然后交给多个线程去跑,
因为线程间数据的共享的问题。
它包含两类:
一种只是用来生产数据,
另外一种只是用来消费数据.
为了串联他们,通常会采用共享的数据区域,
就像一个仓库.生产者产生的数据都放入仓库中并不需要关注消费者的行为,
消费者只需要从共享仓库中获取数据,并不需要关心生产者的行为.
from queue import Queue
Queue实例对象.put(item)
Queue实例对象.get()
Queue实例对象.empty()
Queue实例对象.full()
Queue实例对象.qsize()
Queue实例对象.task_done()
Queue实例对象.join()
q.get_nowait() 相当q.get(False) 非阻塞
q.put_nowait(item) 相当q.put(item, False) 非阻塞
"""
get获取后记得task_down一下
同时在主程序后面进行join
"""
3.实现
import queue
q = queue.Queue()
for i in range(5):
q.put(i)
while not q.empty():
print(q.get())
import random
import time
from queue import Queue
import threading
def generate_data(q):
print('generate_data')
for i in range(5):
if not q.full():
sleep_time = random.randint(1, 2)
q.put(sleep_time)
else:
break
def operating(q):
print(not q.empty())
if q.qsize() == 1:
generate_data(q)
else:
data_time = q.get()
q.task_done()
print(f'停留时间: {data_time}')
time.sleep(data_time)
if __name__ == '__main__':
q = Queue(5)
generate_data(q)
while not q.empty():
operat = threading.Thread(target=operating, args=(q,))
operat.start()
operat.join()
q.join()