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

时间:2016-02-22 16:18:24

标签: python python-2.7 python-multithreading

从队列中删除元素取决于元素的内容。 要访问内容,唯一建议的方法是通过rescan-scsi-bus.sh方法。

但是,也可以通过powermt display方式访问队列的内容。这意味着直接从底层myQueue.get()阅读内容。这意味着以这种方式读取内容并不能提供最初为该队列创建的线程安全权限。

是否有一种线程安全的方法来读取内容而不删除元素?

1 个答案:

答案 0 :(得分:1)

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

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()