我有一个asyncio.PriorityQueue
作为web爬虫程序的URL队列,得分最低的URL是我调用url_queue.get()
时从队列中第一个删除的URL。当队列到达maxsize
个项目时,默认行为是阻止对url_queue.put()
的调用,直到对get()
的调用从队列中删除一个项目以腾出空间。在
我想做的是永远不要阻塞,而是在我试图put()
一个得分较低的项目时,推掉得分最高的队列项目(或者至少是得分最高的项目)。在asyncio.PriorityQueue
中,有没有一种方法可以自动从堆底部删除项?如果没有,是否有其他优先级队列/堆实现可以与asyncio一起工作,这将使我能够做到这一点?或者其他一些数据结构/技术,使我能够拥有某种非阻塞的、优先级最高的队列?在
谢谢!在
默认情况下不是这样,但是从
asyncio.PriorityQueue
继承并实现所需的行为应该很简单。与多线程队列实现不同,asyncio队列在单个线程中运行,因此不需要担心同步问题。在性能方面可能存在的一个问题是,
PriorityQueue
不是设计为双端队列的,因此它使用堆来存储项。堆可以是min或max,但不是两者都是;Python的heapq
模块实现了一个最小堆,但是可以通过将优先级乘以-1来轻松模拟max堆。在最小堆中,可以在对数时间内访问和弹出最小的项,但不能访问最大的项,而在最大堆中则相反。为了有效地操作最小和最大的项,需要从asyncio.Queue
继承并使用不同的数据结构来存储项,例如sorted list。在例如(未测试):
该类实现了两个不同的关注点:
_get
、_put
和{Queue
模块中(queue
在Python3中)和随后的asyncio.queue
。在put
和put_nowait
公共方法来实现drop when full语义。在相关问题 更多 >
编程相关推荐