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中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
python optparse模块使用实例
Apr 09 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
Python中整数的缓存机制讲解
Feb 16 Python
如何通过python画loss曲线的方法
Jun 26 Python
python命名空间(namespace)简单介绍
Aug 10 Python
Centos7 下安装最新的python3.8
Oct 28 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
浅析python中的del用法
Sep 02 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 Python
python 下载文件的几种方式分享
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
web方式ftp
2006/10/09 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
js+html实现周岁年龄计算器
2019/06/25 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
Python守护进程用法实例分析
2015/06/04 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
python批量获取html内body内容的实例
2019/01/02 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
django跳转页面传参的实现
2020/09/17 Python
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
全球性的在线商店:Vogca
2019/05/10 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
安踏广告词改编版
2014/03/21 职场文书
法人授权委托书范本
2014/09/17 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
民事答辩状范本
2015/05/21 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
vue elementUI批量上传文件
2022/04/26 Vue.js