from collection import deque
class Foo(deque[str]):
def append(self, val: str):
if val == 'A':
super().append(val)
else:
try:
while True:
super().remove('B')
except ValueError:
pass
super().append(val)
字符串
注意:* while True块在这里,以防你从一个可迭代对象初始化队列,并且有超过1个“B”来开始,因为没有什么能阻止你这样做:q = Foo(['B', 'B', 'B', 'B'])。如果你想,你也可以ovverride父对象的__init __,以确保队列中总是只有1个'B'。
queue = deque()
def push(x):
queue.append(x)
def pop(x):
while True:
result = queue.popleft()
if result == 'B' and 'B' in queue:
continue
return result
字符串 再多做一点努力,你就可以统计队列中B的数量,只在计数下降到0时才处理B。这将保存'B' in queue的成本,但计数必须通过一个锁来访问才是线程安全的。
3条答案
按热度按时间ne5o7dgx1#
你可能可以子类化一个
collections.deque
并得到类似这样的结果:字符串
while True
块在这里,以防你从一个可迭代对象初始化队列,并且有超过1个“B”来开始,因为没有什么能阻止你这样做:q = Foo(['B', 'B', 'B', 'B'])
。如果你想,你也可以ovverride父对象的__init __
,以确保队列中总是只有1个'B'
。然后你可以继续把任务放在队列中:
型
最后,使用
popleft()
以FIFO顺序获取元素。deque
也应该是线程安全的:https://docs.python.org/3/library/collections.html#collections.dequegpfsuwkq2#
与其试图从队列中驱逐B,不如在弹出B时检查它是否是队列中唯一的一个,这可能是最简单的方法。
字符串
再多做一点努力,你就可以统计队列中B的数量,只在计数下降到0时才处理B。这将保存
'B' in queue
的成本,但计数必须通过一个锁来访问才是线程安全的。ddarikpa3#
从潜在的长任务队列中踢出现有的不重要任务的更有效的方法是使用双向链表作为队列,并维护对不重要任务的节点的引用(如果有的话),以便可以在 O(1) 时间复杂度内删除引用的节点。
使用
llist.dllist
,一个来自llist
模块的双向链表的优秀实现:字符串
以便:
型
产出:
型
演示:https://replit.com/@blhsing1/UnimportantTaskQueue#main.py