「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。
正式的Python专栏第70篇,同学站住,别错过这个从0开始的文章!
终于来到队列篇的最后一个类了LifoQueue,这篇需要读者先去读前面queue.Queue的文章。
关于这个Lifo的代码Demo,读者可以去补一补这篇 Lifo vs Fifo Queue展示
结合前两篇queue.Queue类的代码解析,本篇关于LifoQueue就非常简单了。
LifoQueue源码解析
LifoQueue直接继承了Queue这个类,直接重写了初始化(_init) 和 队列长度(_qsize) 以及_put 和 _get 方法。
这样就把父类Queue的qsize,get,put 的内在行为重写了,锁还是沿用父类的模式,前面分享的上篇和下篇是本文的补充,但是这里不重复解析一次。
直接看一遍LifoQueue的源码:
class LifoQueue(Queue):
'''Variant of Queue that retrieves most recently added entries first.'''
def _init(self, maxsize):
self.queue = []
def _qsize(self):
return len(self.queue)
def _put(self, item):
self.queue.append(item)
def _get(self):
return self.queue.pop()
初始化这里用的队列是普通列表,而非deque。因为直接调用列表的pop方法就能实现元素后进先出功能了。
其他的get和put还是沿用了父类的三个Condition锁和mutex锁。
因为继承queue.Queue类,这个类确实没啥特别的地方。
唯一的看点就是:_get方法直接调用pop方法就能实现后进先出功能了。
也就是对比的来看这两个类,这样一下子就学会两个类。
收尾
LifoQueue 并非非常简单,在queue.Queue这个队列的基础上,这个类设计显得简洁很多。
有了前面两篇关于queue.Queue的解析,我们看完Queue这个类的两篇文章来看这个队列就变得非常容易了。
LifoQueue 跟父类Queue的区别就是内置的数据容器不同,取出元素顺序不同,仅此。
喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏
持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!