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 w和w+权限的区别详解
Jan 23 Python
Python Django框架实现应用添加logging日志操作示例
May 17 Python
opencv 获取rtsp流媒体视频的实现方法
Aug 23 Python
python numpy存取文件的方式
Apr 01 Python
Python any()函数的使用方法
Oct 28 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
python构造IP报文实例
May 05 Python
tensorflow模型转ncnn的操作方式
May 25 Python
如何一键升级Python所有包
Nov 05 Python
Python中常用的os操作汇总
Nov 05 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
python单例模式的应用场景实例讲解
Feb 24 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简单系统查询模块代码打包下载
2008/06/07 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
php设计模式小结
2013/02/15 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
小程序实现密码输入框
2020/11/16 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Ruby元编程基础学习笔记整理
2016/07/02 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
python中pow函数用法及功能说明
2020/12/04 Python
python爬取代理ip的示例
2020/12/18 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
年度考核自我评价
2014/01/25 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
重阳节主题班会
2015/08/17 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server