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当中的数据类型和变量
Apr 25 Python
python高手之路python处理excel文件(方法汇总)
Jan 07 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
Python占用的内存优化教程
Jul 28 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
python中property和setter装饰器用法
Dec 19 Python
python str字符串转uuid实例
Mar 03 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
Opencv 图片的OCR识别的实战示例
Mar 02 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正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
PHP求最大子序列和的算法实现
2011/06/24 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
遭遇php的in_array低性能问题
2013/09/17 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
Python标准库itertools的使用方法
2020/01/17 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
什么是跨站脚本攻击
2014/12/11 面试题
十岁生日同学答谢词
2014/01/19 职场文书
会计求职自荐信
2015/03/26 职场文书
《春酒》教学反思
2016/02/22 职场文书