python线程优先级队列知识点总结


Posted in Python onFebruary 28, 2021

Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列 PriorityQueue。

1、说明

这些队列都实现了锁原语,能够在多线程中直接使用,可以使用队列来实现线程间的同步。

模块中的常用方法如下:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回True,反之False
  • Queue.full() 如果队列满了,返回True,反之False
  • Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]])获取队列,timeout等待时间
  • Queue.get_nowait() 相当Queue.get(False)
  • Queue.put(item) 写入队列,timeout等待时间
  • Queue.put_nowait(item) 相当Queue.put(item, False)
  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作

2、实例

#!/usr/bin/python3
import queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
  def __init__(self, threadID, name, q):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.q = q
  def run(self):
    print ("开启线程:" + self.name)
    process_data(self.name, self.q)
    print ("退出线程:" + self.name)
def process_data(threadName, q):
  while not exitFlag:
    queueLock.acquire()
    if not workQueue.empty():
      data = q.get()
      queueLock.release()
      print ("%s processing %s" % (threadName, data))
    else:
      queueLock.release()
    time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1
# 创建新线程
for tName in threadList:
  thread = myThread(threadID, tName, workQueue)
  thread.start()
  threads.append(thread)
  threadID += 1
# 填充队列
queueLock.acquire()
for word in nameList:
  workQueue.put(word)
queueLock.release()
# 等待队列清空
while not workQueue.empty():
  pass
# 通知线程是时候退出
exitFlag = 1
# 等待所有线程完成
for t in threads:
  t.join()
print ("退出主线程")

知识点扩展:

问题

怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素

解决方案

下面的类利用 heapq 模块实现了一个简单的优先级队列:

import heapq

class PriorityQueue:
 def __init__(self):
 self._queue = []
 self._index = 0

 def push(self, item, priority):
 heapq.heappush(self._queue, (-priority, self._index, item))
 self._index += 1

 def pop(self):
 return heapq.heappop(self._queue)[-1]

下面是它的使用方式:

>>> class Item:
... def __init__(self, name):
...  self.name = name
... def __repr__(self):
...  return 'Item({!r})'.format(self.name)
...
>>> q = PriorityQueue()
>>> q.push(Item('foo'), 1)
>>> q.push(Item('bar'), 5)
>>> q.push(Item('spam'), 4)
>>> q.push(Item('grok'), 1)
>>> q.pop()
Item('bar')
>>> q.pop()
Item('spam')
>>> q.pop()
Item('foo')
>>> q.pop()
Item('grok')
>>>

到此这篇关于python线程优先级队列知识点总结的文章就介绍到这了,更多相关python线程优先级队列有哪些内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python解析中国天气网的天气数据
Mar 21 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
Python之web模板应用
Dec 26 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
django 邮件发送模块smtp使用详解
Jul 22 Python
Python实现滑动平均(Moving Average)的例子
Aug 24 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 Python
python 写一个文件分发小程序
Dec 05 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
利用Opencv实现图片的油画特效实例
Feb 28 #Python
利用python实现后端写网页(flask框架)
Feb 28 #Python
python pyg2plot的原理知识点总结
Feb 28 #Python
python在协程中增加任务实例操作
Feb 28 #Python
python 制作本地应用搜索工具
Feb 27 #Python
如何用Python进行时间序列分解和预测
Mar 01 #Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 #Python
You might like
PHP新手上路(三)
2006/10/09 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
Yii清理缓存的方法
2016/01/06 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
python 多进程通信模块的简单实现
2014/02/20 Python
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
深入解析神经网络从原理到实现
2019/07/26 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
Python批量启动多线程代码实例
2020/02/18 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
餐厅执行经理岗位职责范本
2014/02/26 职场文书
保险公司演讲稿
2014/09/02 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫
Python中requests库的用法详解
2022/06/05 Python
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js