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 21 Python
Python的Tornado框架异步编程入门实例
Apr 24 Python
python使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
pygame实现雷电游戏雏形开发
Nov 20 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
python关于调用函数外的变量实例
Dec 26 Python
给 TensorFlow 变量进行赋值的方式
Feb 10 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
keras 自定义loss层+接受输入实例
Jun 28 Python
python3.9之你应该知道的新特性详解
Apr 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
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
Jquery动态列功能完整实例
2019/08/30 jQuery
js中switch语句的学习笔记
2020/03/25 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
HTML5标签大全
2016/11/23 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
Why we need EJB
2016/10/20 面试题
报关专员求职信范文
2014/02/22 职场文书
法制宣传标语
2014/06/23 职场文书
片区教研活动总结
2014/07/02 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
基于Python实现股票收益率分析
2022/04/02 Python
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python