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脚本实现代码行数统计代码分享
Mar 10 Python
在Python中使用PIL模块处理图像的教程
Apr 29 Python
Python标准库之Sys模块使用详解
May 23 Python
python学习必备知识汇总
Sep 08 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
python cs架构实现简单文件传输
Mar 20 Python
python3下载抖音视频的完整代码
Jun 05 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
浅谈Python访问MySQL的正确姿势
Jan 07 Python
Python OpenCV之常用滤波器使用详解
Apr 07 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
PHP生成静态页面详解
2006/12/05 PHP
PHP和XSS跨站攻击的防范
2007/04/17 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
Yii配置文件用法详解
2014/12/04 PHP
php输出形式实例整理
2020/05/05 PHP
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
移动节点的jquery代码
2014/01/13 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
python daemon守护进程实现
2016/08/27 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
Python网页解析器使用实例详解
2020/05/30 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
城市规划毕业生求职信
2013/10/10 职场文书
协议书与合同的区别
2014/04/18 职场文书
大学学习计划书范文
2014/05/02 职场文书
激励口号大全
2014/06/17 职场文书
工作求职信
2014/07/04 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
2014和解协议书范文
2014/09/15 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
学生检讨书范文
2014/10/30 职场文书