我可以在不破坏线程安全的情况下读取队列中最旧元素的内容吗?
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()
从我的队列中删除元素取决于元素的内容。
为了访问内容,唯一建议的方法是通过 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()