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中的私有属性
Aug 21 Python
Python中的exec、eval使用实例
Sep 23 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
Apr 01 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
python简单猜数游戏实例
Jul 09 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
python3利用Socket实现通信的方法示例
May 06 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
总结python多进程multiprocessing的相关知识
Jun 29 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
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
js中url对象化管理分析
2017/12/29 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
详解Python中的Descriptor描述符类
2016/06/14 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
python实现简易动态时钟
2018/11/19 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
python 实现目录复制的三种小结
2019/12/04 Python
python中的django是做什么的
2020/07/31 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
财务科科长岗位职责
2014/03/10 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
导游词400字
2015/02/13 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
身份证丢失证明
2015/06/19 职场文书
个人工作决心书
2015/09/22 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js