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实现屏幕截图的代码及函数详解
Oct 01 Python
python实现12306火车票查询器
Apr 20 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
Python lxml解析HTML并用xpath获取元素的方法
Jan 02 Python
提升Python效率之使用循环机制代替递归函数
Jul 23 Python
Python数据存储之 h5py详解
Dec 26 Python
python构造IP报文实例
May 05 Python
keras的三种模型实现与区别说明
Jul 03 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
Nov 05 Python
python字典按照value排序方法
Dec 28 Python
python中if嵌套命令实例讲解
Feb 25 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获取远程图片并把它保存到本地的代码
2008/04/07 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
python 解析html之BeautifulSoup
2009/07/07 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
python join方法使用详解
2019/07/30 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
Django如何批量创建Model
2020/09/01 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
介绍一下Ruby的特点
2013/01/20 面试题
期末自我鉴定
2014/01/23 职场文书
交通事故和解协议书
2015/01/27 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js
python周期任务调度工具Schedule使用详解
2021/11/23 Python