我可以在不破坏线程安全的情况下读取队列中最旧元素的内容吗?

Can I read content of the oldest element in a Queue without ruining thread safety?

从我的队列中删除元素取决于元素的内容。 为了访问内容,唯一建议的方法是通过 myQueue.get() 方法。

不过也可以用那种方式访问​​队列的内容myQueue.queue[0]。这转化为直接从底层 deque 读取内容。这意味着以这种方式读取内容不提供最初创建队列的线程安全权限。

有没有一种线程安全的方法可以在不删除元素的情况下读取内容?

您可能需要调整下面显示的解决方案。如果元素满足某些条件,它允许您获取元素。您的问题没有明确说明您希望如何处理阻塞、超时或无法找到匹配项目。因此,以下代码是非阻塞的,并且 returns 当最旧的值与给定条件不匹配时的默认值。请修改代码以适合您的特定使用场景。

import queue


class Queue(queue.Queue):

    def get_if(self, condition, default=None):
        with self.not_empty:
            if not self._qsize():
                raise queue.Empty
            if condition(self._peek()):
                item = self._get()
                self.not_full.notify()
                return item
            return default

    def _peek(self):
        return self.queue[0]


def main():
    my_queue = Queue()
    for number in range(100, 200):
        my_queue.put_nowait(number)
    number = my_queue.get_if(lambda item: not item % 10)
    print(number)


if __name__ == '__main__':
    main()