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中的JSON使用
Apr 28 Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 Python
如何在python字符串中输入纯粹的{}
Aug 22 Python
python实现RabbitMQ的消息队列的示例代码
Nov 08 Python
python组合无重复三位数的实例
Nov 13 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
python numpy中cumsum的用法详解
Oct 17 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
通过实例简单了解python yield使用方法
Aug 06 Python
python 检测图片是否有马赛克
Dec 01 Python
python 通过exifread读取照片信息
Dec 24 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
python备份文件的脚本
2008/08/11 Python
详解Python中的Cookie模块使用
2015/07/06 Python
利用Python如何生成随机密码
2016/04/20 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
PHP面试题及答案一
2012/06/18 面试题
群众路线批评与自我批评
2014/02/06 职场文书
家长写给孩子的评语
2014/04/18 职场文书
小学学校评估方案
2014/06/08 职场文书
土地租赁意向书
2014/07/30 职场文书
初级党校心得体会
2014/09/11 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
法人代表证明书范本
2015/06/18 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript