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实现的一个自动售饮料程序代码分享
Aug 25 Python
介绍Python的@property装饰器的用法
Apr 28 Python
利用python获取Ping结果示例代码
Jul 06 Python
Python学生信息管理系统修改版
Mar 13 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
Python基础详解之描述符
Apr 28 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 preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
深入php函数file_get_contents超时处理的方法详解
2013/06/03 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
老生常谈PHP中的数据结构:DS扩展
2017/07/17 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
jquery trim() 功能源代码
2011/02/14 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
详解python的数字类型变量与其方法
2016/11/20 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
Python探索之SocketServer详解
2017/10/28 Python
Python中单、双下划线的区别总结
2017/12/01 Python
Python 硬币兑换问题
2019/07/29 Python
Python面向对象编程基础实例分析
2020/01/17 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
教师自荐书
2013/10/08 职场文书
经典演讲稿范文
2013/12/30 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
实习推荐信格式模板
2015/03/27 职场文书
党员进社区活动总结
2015/05/07 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
一文弄懂MySQL索引创建原则
2022/02/28 MySQL