16.线程队列

1.什么是队列?

队列(queue),是先进先出(FIFO, First-In-First-Out)的线性表,
在具体应用中通常用链表或者数组来实现,
队列只允许在后端(称为rear)进行插入操作,
在前端(称为front)进行删除操作,
队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加

在这里插入图片描述

2.队列操作



我们经常会遇到这样的一个问题,这里有成千上万条数据,
每次需要取出其中的一条数据进行处理,
那么引入多线程该怎么进行任务分配?

我们可以将数据进行分割然后交给多个线程去跑,
因为线程间数据的共享的问题。

它包含两类:
    一种只是用来生产数据,
    另外一种只是用来消费数据.
        为了串联他们,通常会采用共享的数据区域,
        就像一个仓库.生产者产生的数据都放入仓库中并不需要关注消费者的行为,
        消费者只需要从共享仓库中获取数据,并不需要关心生产者的行为.



# 队列使用
from queue import Queue
# 可以通过设定Queue的默认参数maxsize来设定队列长度, 默认长度无限

# 入队
Queue实例对象.put(item)  # item入队数据

# 出队
Queue实例对象.get()  # 出队获取数据并删除其数据

# 测试空
Queue实例对象.empty()  # 判断队列q是否为空,当队列q空时,返回true;否则为false

# 测试满
Queue实例对象.full()  # 管道中的数据是否是满的

# 队列长度
Queue实例对象.qsize()

# 任务完成
Queue实例对象.task_done() # 在完成一项工作之后,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)  # 队列长度为5

    generate_data(q)
    while not q.empty():
        operat = threading.Thread(target=operating, args=(q,))  # 操作线程
        operat.start()
        operat.join()
    q.join()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值