消息队列的先进先出
首先,要告诉大家的事,消息队列可不是只有queue.Queue这一个类,除它之外,还有queue.LifoQueue和queue.PriorityQueue这两个类。
从名字上,对于他们之间的区别,你大概也能猜到一二吧。
queue.Queue:先进先出队列
queue.LifoQueue:后进先出队列
queue.PriorityQueue:优先级队列
先来看看,我们的老朋友,queue.Queue。
所谓的先进先出(FIFO,First in First Out),就是先进入队列的消息,将优先被消费。
这和我们日常排队买菜是一样的,先排队的人肯定是先买到菜。
用代码来说明一下
![](https://img.haomeiwen.com/i13717038/0f7324b07e230abd.png)
看看输出,符合我们先进先出的预期。存入队列的顺序是01234,被消费的顺序也是01234。
![](https://img.haomeiwen.com/i13717038/973fca53a4d68e7a.png)
再来看看Queue.LifoQueue,后进先出,就是后进入消息队列的,将优先被消费。
这和我们羽毛球筒是一样的,最后放进羽毛球筒的球,会被第一个取出使用。
用代码来看下
![](https://img.haomeiwen.com/i13717038/9bf170098f2f149e.png)
来看看输出,符合我们后进后出的预期。存入队列的顺序是01234,被消费的顺序也是43210。
![](https://img.haomeiwen.com/i13717038/c91614f0d0161c51.png)
最后来看看Queue.PriorityQueue,优先级队列。
这和我们日常生活中的会员机制有些类似,办了金卡的人比银卡的服务优先,办了银卡的人比不办卡的人服务优先。
来用代码看一下
![](https://img.haomeiwen.com/i13717038/90166c552f21fdc6.png)
来看看输出,符合我们的预期。我们存入入队列的顺序是25341,对应的优先级也是25341,可是被消费的顺序丝毫不受传入顺序的影响,而是根据指定的优先级来消费。
![](https://img.haomeiwen.com/i13717038/10f79e48d8a7b402.png)
创建多线程的两种方式
在使用多线程处理任务时也不是线程越多越好,由于在切换线程的时候,需要切换上下文环境,依然会造成cpu的大量开销。为解决这个问题,线程池的概念被提出来了。预先创建好一个较为优化的数量的线程,让过来的任务立刻能够使用,就形成了线程池。
在Python3中,创建线程池是通过concurrent.futures函数库中的ThreadPoolExecutor类来实现的。
![](https://img.haomeiwen.com/i13717038/56e33a32666f06dc.png)
从结果来看,前面设置线程池最大线程数5个,有生效。
![](https://img.haomeiwen.com/i13717038/9fc524065cd0c676.png)
除了使用上述第三方模块的方法之外,我们还可以自己结合前面所学的消息队列来自定义线程池。
这里我们就使用queue来实现一个上面同样效果的例子,大家感受一下。
![](https://img.haomeiwen.com/i13717038/5b8692ca76fa8d96.png)
输出是和上面是完全一样的效果
![](https://img.haomeiwen.com/i13717038/d2fd390a692a1a2a.png)
构建线程池的方法,是可以很灵活的,大家有举可以自己多研究。但是建议只要掌握一种自己熟悉的,能快速上手的就好了。
网友评论