Python 中的优先级队列实战
温馨提醒
总结摘要
最近在用 Pyside2 写机器人的上位机项目时,遇到了一个需要用到优先级队列的场景
前言
最近在用 Pyside2 写机器人的上位机项目时,遇到了一个需要用到优先级队列的场景
服务端的情况特殊,只能维持一个长连接,监听一个 TCP 活动端口,因此一次只能响应一个命令请求
所以“客户端”这边,只能有一个线程去和“服务端通信”
因此根据设备的情况,和业务的需要,设计了如下的程序框架:

那么,优先级队列,怎么发挥他的作用呢?
优先级队列
简单介绍一下 python 中优先级队列
PriorityQueue是Python标准库queue模块中的一个类,它实现了一个优先队列。优先队列中的每个元素都有一个优先级,优先级最高(数值最小)的元素最先出队。
在Python中,我们可以使用PriorityQueue类的put()方法添加元素,使用get()方法获取并删除优先级最高的元素。
以下是一个简单的例子:
在这个例子中,'eat'有最高的优先级(1),所以它会被最先打印出来。
用起来吧!
数字的大小,代表这个对象的,在队列中,被取出时的优先级,越小越优先(VIP)
数字可以是浮点数,例如:0.5、1、1.5…
ProducerThreadA类模拟不断产生,优先级较低的,”查询命令“的线程ProducerThreadB类模拟不断产生,优先级高的”控制命令“的线程ConsumerThread类模拟”服务端“,不断处理来自,客户端的命令
| |
运行代码,效果如下:
可能存在的问题
优先级的队列机制也不是万能的
如果服务端,出现异常,或者没能及时处理完队列中的命令
所以,上面的代码,是可能会导致客户端内存的不断增加的!
因此需要限制队列的大小,以及生产者的发送能力,尽量避免无法控制的情况发生
修改一下刚刚的代码:
| |
运行一下,看看队列中命令,是否被控制在 10 个之内~
| |
好了,可以暂时歇会了)
怎么处理返回的命令呢?返回的命令如何赋予优先级呢?
不管了,明天再说吧。