从队列中删除一个项目?

11

在Python中,是否有可能删除一个项目并使多线程队列重新排序?

我有用户排队等候处理,但如果在处理用户时用户断开连接,这将导致问题。

是否有方法可以解决这个问题?

谢谢


5
你可以将未连接的元素标记为无效,然后稍后跳过它,而不是即时删除它吗? - 6502
是的,我在发完问题之后也有了这个想法,但是直到现在我都没有网络.. - Pwnna
2个回答

10
Queue 对象不支持随机访问。但是,您可以通过在其他地方保留队列中对象的引用并将它们标记为过时来实现相同的目的。当从队列中读取对象时,消费者可以检查该对象是否过时,如果是,则丢弃它并重新读取。
您还可以尝试使用 PriorityQueue 类,在这个类中,您需要将 (优先级, 消息) 放置到队列中,而不仅仅是放置消息。具有最低 priority 值的数据始终是从队列中读取的下一个数据。这本身不能解决您的问题,但它可能会给您一种按照最旧请求或类似方式确定优先级的方法。

-1

是可以的。您可以通过访问队列元素来删除特定项。 remove 是 Queue.queue 中的一个方法。

>>> from queue import Queue
>>> f = Queue(3)
>>> f.put(4)
>>> f.put(3)
>>> f.put(2)
>>> f.queue
deque([4,3,2])
>>> f.queue.__dir
['__new__', '__repr__', '__hash__', '__getattribute__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__iter__', '__init__', '__len__', '__add__', '__mul__', '__rmul__', '__getitem__', '__setitem__', '__delitem__', '__contains__', '__iadd__', '__imul__', 'append', 'appendleft', 'clear', '__copy__', 'copy', 'count', 'extend', 'extendleft', 'index', 'insert', 'pop', 'popleft', '__reduce__', 'remove', '__reversed__', 'reverse', 'rotate', '__sizeof__', '__class_getitem__', 'maxlen', '__doc__', '__str__', '__setattr__', '__delattr__', '__reduce_ex__', '__getstate__', '__subclasshook__', '__init_subclass__', '__format__', '__dir__', '__class__']
>>> f.queue.remove(3)
>>> f.queue
deque([4,2])

这会访问 queue.Queue 的未记录实现细节,同时破坏类使用的同步机制,导致潜在的异常或死锁。 - user2357112
你能再解释一下吗?因为我认为deque是Queue的基类,所以访问基类应该没问题吧? - Ifiok Ekott
这不是基类的工作方式。 f.queue 是一个属性,但不是一个文档化的属性。 如果 dequeQueue 的基类,则 isinstance(f,collections.deque) 将报告 True ,但它实际上返回了 False - user2357112
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接