首页 / PYTHON / Python3 queue队列类
Python3 queue队列类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python3 queue队列类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4311字,纯文字阅读大概需要7分钟。
内容图文
![Python3 queue队列类](/upload/InfoBanner/zyjiaocheng/829/0f5be268d1784c118aafcdd987cb7153.jpg)
class queue.
PriorityQueue
(maxsize=0)
优先级队列构造函数。 maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。
最小值先被取出( 最小值条目是由 sorted(list(entries))[0]
返回的条目)。条目的典型模式是一个以下形式的元组: (priority_number,?data)
。
如果 data 元素没有可比性,数据将被包装在一个类中,忽略数据值,仅仅比较优先级数字 :
1 from dataclasses import dataclass, field 2 from typing import Any 3 4 @dataclass(order=True) 5 class PrioritizedItem: 6 priority: int 7 item: Any=field(compare=False)
Queue对象
队列对象 (Queue, LifoQueue, 或者 PriorityQueue) 提供下列描述的公共方法。
Queue.
qsize
()-
返回队列的大致大小。注意,qsize() > 0 不保证后续的 get() 不被阻塞,qsize() < maxsize 也不保证 put() 不被阻塞。
Queue.
empty
()-
如果队列为空,返回
True
,否则返回False
。如果 empty() 返回True
,不保证后续调用的 put() 不被阻塞。类似的,如果 empty() 返回False
,也不保证后续调用的 get() 不被阻塞。
Queue.
full
()-
如果队列是满的返回
True
,否则返回False
。如果 full() 返回True
不保证后续调用的 get() 不被阻塞。类似的,如果 full() 返回False
也不保证后续调用的 put() 不被阻塞。
Queue.
put
(item, block=True, timeout=None)-
将 item 放入队列。如果可选参数 block 是 true 并且 timeout 是
None
(默认),则在必要时阻塞至有空闲插槽可用。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间没有可用的空闲插槽,将引发 Full 异常。反之 (block 是 false),如果空闲插槽立即可用,则把 item 放入队列,否则引发 Full 异常 ( 在这种情况下,timeout 将被忽略)。
Queue.
put_nowait
(item)-
相当于
put(item,?False)
。
Queue.
get
(block=True, timeout=None)-
从队列中移除并返回一个项目。如果可选参数 block 是 true 并且 timeout 是
None
(默认值),则在必要时阻塞至项目可得到。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。反之 (block 是 false) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。POSIX系统3.0之前,以及所有版本的Windows系统中,如果 block 是 true 并且 timeout 是
None
, 这个操作将进入基础锁的不间断等待。这意味着,没有异常能发生,尤其是 SIGINT 将不会触发 KeyboardInterrupt 异常。
Queue.
get_nowait
()-
相当于
get(False)
。
提供了两个方法,用于支持跟踪 排队的任务 是否 被守护的消费者线程 完整的处理。
Queue.
task_done
()-
表示前面排队的任务已经被完成。被队列的消费者线程使用。每个 get() 被用于获取一个任务, 后续调用 task_done() 告诉队列,该任务的处理已经完成。
如果 join() 当前正在阻塞,在所有条目都被处理后,将解除阻塞(意味着每个 put() 进队列的条目的 task_done() 都被收到)。
如果被调用的次数多于放入队列中的项目数量,将引发 ValueError 异常 。
Queue.
join
()-
阻塞至队列中所有的元素都被接收和处理完毕。
当条目添加到队列的时候,未完成任务的计数就会增加。每当消费者线程调用 task_done() 表示这个条目已经被回收,该条目所有工作已经完成,未完成计数就会减少。当未完成计数降到零的时候, join() 阻塞被解除。
如何等待排队的任务被完成的示例:
1 def worker(): 2 while True: 3 item = q.get() 4 if item is None: 5 break 6 do_work(item) 7 q.task_done() 8 9 q = queue.Queue() 10 threads = [] 11 for i in range(num_worker_threads): 12 t = threading.Thread(target=worker) 13 t.start() 14 threads.append(t) 15 16 for item in source(): 17 q.put(item) 18 19 # block until all tasks are done 20 q.join() 21 22 # stop workers 23 for i in range(num_worker_threads): 24 q.put(None) 25 for t in threads: 26 t.join()
一道leetcode题目:
347. Top K Frequent Elements 前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
说明:
- 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
1 class Solution: 2 def topKFrequent(self, nums, k: int): 3 if k<0 or k>len(nums): return [] 4 from queue import PriorityQueue 5 from collections import defaultdict 6 queue = PriorityQueue() 7 d = defaultdict(int) 8 res = [] 9 for i in nums: 10 d[i]+=1 11 d = list(d.items()) 12 print(d) 13 for i in range(len(d)): 14 queue.put([-d[i][1],d[i][0]]) 15 for i in range(k): 16 res.append(queue.get()[1]) 17 return res
参考自 Python 标准库
内容总结
以上是互联网集市为您收集整理的Python3 queue队列类全部内容,希望文章能够帮你解决Python3 queue队列类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。