Python 中的优先级队列实战
温馨提醒
🚀 注意啦!这篇文章来自1 年 218 天 以前,可能已跟不上时代的步伐。阅读时请自备时光机,小心穿越哦!
总结摘要
最近在用 Pyside2 写机器人的上位机项目时,遇到了一个需要用到优先级队列的场景
前言
最近在用 Pyside2 写机器人的上位机项目时,遇到了一个需要用到优先级队列的场景
服务端的情况特殊,只能维持一个长连接,监听一个 TCP 活动端口,因此一次只能响应一个命令请求
所以“客户端”这边,只能有一个线程去和“服务端通信”
因此根据设备的情况,和业务的需要,设计了如下的程序框架:
那么,优先级队列,怎么发挥他的作用呢?
优先级队列
简单介绍一下 python 中优先级队列
PriorityQueue
是Python标准库queue
模块中的一个类,它实现了一个优先队列。优先队列中的每个元素都有一个优先级,优先级最高(数值最小)的元素最先出队。
在Python中,我们可以使用PriorityQueue
类的put()
方法添加元素,使用get()
方法获取并删除优先级最高的元素。
以下是一个简单的例子:
在这个例子中,'eat'
有最高的优先级(1),所以它会被最先打印出来。
用起来吧!
数字的大小,代表这个对象的,在队列中,被取出时的优先级,越小越优先(VIP)
数字可以是浮点数,例如:0.5
、1
、1.5
…
ProducerThreadA
类模拟不断产生,优先级较低的,”查询命令“的线程ProducerThreadB
类模拟不断产生,优先级高的”控制命令“的线程ConsumerThread
类模拟”服务端“,不断处理来自,客户端的命令
flowchart LR
ProducerThreadA & ProducerThreadB --> 优先级队列 --> ConsumerThread
|
|
运行代码,效果如下:
可能存在的问题
优先级的队列机制也不是万能的
如果服务端,出现异常,或者没能及时处理完队列中的命令
所以,上面的代码,是可能会导致客户端内存的不断增加的!
因此需要限制队列的大小,以及生产者的发送能力,尽量避免无法控制的情况发生
修改一下刚刚的代码:
|
|
运行一下,看看队列中命令,是否被控制在 10 个之内~
|
|
好了,可以暂时歇会了)
怎么处理返回的命令呢?返回的命令如何赋予优先级呢?
不管了,明天再说吧。