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实现telnet客户端的方法
Apr 15 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
Python探索之静态方法和类方法的区别详解
Oct 27 Python
python爬取m3u8连接的视频
Feb 28 Python
python实现zabbix发送短信脚本
Sep 17 Python
Python高级特性切片(Slice)操作详解
Sep 27 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
Python Selenium参数配置方法解析
Jan 19 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 Python
Opencv 图片的OCR识别的实战示例
Mar 02 Python
pytorch model.cuda()花费时间很长的解决
Jun 01 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
BBS(php & mysql)完整版(四)
2006/10/09 PHP
hessian 在PHP中的使用介绍
2010/12/13 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
PDO::getAttribute讲解
2019/01/28 PHP
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
Javascript中replace()小结
2015/09/30 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
Python二分法搜索算法实例分析
2015/05/11 Python
python制作最美应用的爬虫
2015/10/28 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
新闻系毕业生推荐信
2013/11/16 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
2015年教师工作总结范文
2015/03/31 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
大学推普周活动总结
2015/05/07 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript