队列空方法坏了吗?

如何检查队列是否为空?运行以下代码:


from multiprocessing import Queue


q = Queue()

print(q.empty())


q.put("a")

print(q.empty())

呈现:


True

True

添加元素后不应该q.empty()返回吗?False


动漫人物
浏览 153回答 3
3回答

米琪卡哇伊

两种可能的解决方案:使用queue.Queueinstead of multiprocessing.Queue:它们之间在文档中的一些差异:它们的区别在于 Queue 缺少 Python 2.5 的 queue.Queue 类中引入的 task_done() 和 join() 方法。from queue import Queueq = Queue()print(q.empty())q.put("a")print(q.empty())或者就像@Hans Musgrave 在评论中所说的那样。time.sleep(1)不能保证。您可以改用time.sleep(0):from multiprocessing import Queueimport timeq = Queue()print(q.empty())time.sleep(0)q.put("a")print(q.empty())他们都给我:TrueFalse关于原因sleep(0),零值会导致线程将其剩余时间片放弃给任何其他准备好运行的线程。如果没有其他线程准备运行,函数立即返回,线程继续执行 cpu让出资源,去执行q.emety()task。我是这么想的。稳定的方法是使用queue.Queueor queues.SimpleQueue。

饮歌长啸

官方推荐的解决方案是使用Manager.Queue.引用自Python 文档:注意:当一个对象被放入队列时,该对象被 pickle 并且后台线程稍后将 pickle 数据刷新到底层管道。这会产生一些令人惊讶的后果,但不会造成任何实际困难——如果它们真的让您感到困扰,那么您可以改用由管理器创建的队列。1. 将对象放入空队列后,在队列的 empty() 方法返回 False 和 get_nowait() 可以返回而不引发 Queue.Empty 之前,可能会有无限小的延迟。2. 如果多个进程都在排队对象,则有可能在另一端乱序接收对象。但是,由同一进程排队的对象将始终按照彼此的预期顺序排列。

千万里不及你

该put方法是异步的,因此在检查元素时队列可能仍然是空的。添加time.sleep(1)后put并empty()返回False。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python