Python 内置队列 FIFO vs FILO 队列对比展示

正式的Python专栏第63篇,同学站住,别错过这个从0开始的文章!

之前的多线程解决线程安全的时候,学委展示了两篇关于队列的 带你验收一款线程安全的队列 使用队列改造转账场景线程安全问题

对比一下FIFO 和 FILO

首先队列这个库里面的queue.Queue类就是一个典型的先进先出队列。

下面写了一些祝福语,使用Queue这个类来编写demo,开头创建一个队列对象q。

后续不断判断队列是否空(q.empty()), 然后通过q.get()调用获取队列元素。

写了三句祝福语,加上序号,先进先出队列会按照元素放入队列的顺序,依次取出队列元素。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/2/2 12:43 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : lifoqdemo.py
# @Project : hello
import queue
import threading
import time

q = queue.Queue(3)  # 虎年就设置一个三吧

q.put("一祝各位朋友们新年快乐")
q.put("二祝各位朋友们身体健康")
q.put("三祝各位朋友们虎年大吉")


def more_blessing():
    count = 0
    while count < 3:
        print("wait....")
        count += 1
        q.put("其他的祝福%s" % count)


def get_from_q():
    max_try = 10
    count = 0
    while count < max_try:
        count += 1
        time.sleep(0.5)
        while not q.empty():
            print("%s ㊗️:%s" % (threading.current_thread().name, q.get()))


threading.Thread(target=get_from_q, name="学委给朋友们拜年了").start()
threading.Thread(target=more_blessing, name="送更多的祝福").start()

这里有3个线程,主线程放入3个祝福,其次是一个线程再追加3个祝福,还有一个线程负责输出队列的元素。

先复制上面的代码直接运行,我们可以查看运行结果:

屏幕快照 2022-02-12 下午11.59.13.png

然后我们可以把队列的类换成下面的LifoQueue队列:

lifoq = queue.LifoQueue(3)  # 虎年就设置一个三吧

从这个输出结果,我们可以看到后进后出的队列,输出祝福的代码是后面的先输出的。

屏幕快照 2022-02-13 上午12.01.10.png

改为后进先出队列,我们在取出队列元素的同时,如果放入新元素,那么输出结果肯定会受到影响。

因为总是Lifo队列每次总是取出最后一个元素。

所以,如果在此运行上面的代码,我们看到的输出又不太一样了。

屏幕快照 2022-02-13 上午12.13.08.png

总结

通过以上队列,我们可以非常直观了解到两款队列的差异

后进先出队列,很像超市货柜,后面放的物品,先被消费者看到。

先进先出队列,就像大家排队体检,排队打饭一样。肯定是先到的先安排。

喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!

猜你喜欢

转载自blog.csdn.net/geeklevin/article/details/124518700