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 相关文章推荐
go语言计算两个时间的时间差方法
Mar 13 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 Python
Python批量发送post请求的实现代码
May 05 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
Python做智能家居温湿度报警系统
Sep 25 Python
Python 转换文本编码实现解析
Aug 27 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
使用python模拟高斯分布例子
Dec 09 Python
python turtle 绘制太极图的实例
Dec 18 Python
关于Python turtle库使用时坐标的确定方法
Mar 19 Python
Python ellipsis 的用法详解
Nov 20 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 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/03/27 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
php导出excel格式数据问题
2014/03/11 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
JS 常用校验函数
2009/03/26 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
python多线程操作实例
2014/11/21 Python
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
Python验证码识别处理实例
2015/12/28 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
windows支持哪个版本的python
2020/07/03 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
Java和Javasciprt的区别
2012/09/02 面试题
Java模拟试题
2014/11/10 面试题
财经学院自荐信范文
2014/02/02 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
《月光曲》教学反思
2016/02/16 职场文书
Hive导入csv文件示例
2022/06/25 数据库