为了账号安全,请及时绑定邮箱和手机立即绑定

队列空方法坏了吗?

队列空方法坏了吗?

动漫人物 2023-05-23 16:53:35
如何检查队列是否为空?运行以下代码:from multiprocessing import Queueq = Queue()print(q.empty())q.put("a")print(q.empty())呈现:TrueTrue添加元素后不应该q.empty()返回吗?False
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

两种可能的解决方案:


使用queue.Queueinstead of multiprocessing.Queue:它们之间在文档中的一些差异:

它们的区别在于 Queue 缺少 Python 2.5 的 queue.Queue 类中引入的 task_done() 和 join() 方法。


from queue import Queue

q = Queue()

print(q.empty())

q.put("a")

print(q.empty())

或者就像@Hans Musgrave 在评论中所说的那样。time.sleep(1)不能保证。您可以改用time.sleep(0):

from multiprocessing import Queue

import time

q = Queue()

print(q.empty())

time.sleep(0)

q.put("a")

print(q.empty())

他们都给我:


True

False

关于原因sleep(0),零值会导致线程将其剩余时间片放弃给任何其他准备好运行的线程。如果没有其他线程准备运行,函数立即返回,线程继续执行 cpu让出资源,去执行q.emety()task。我是这么想的。


稳定的方法是使用queue.Queueor queues.SimpleQueue。


查看完整回答
反对 回复 2023-05-23
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

官方推荐的解决方案是使用Manager.Queue.

引用自Python 文档:

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


查看完整回答
反对 回复 2023-05-23
?
千万里不及你

TA贡献1784条经验 获得超9个赞

put方法是异步的,因此在检查元素时队列可能仍然是空的。添加time.sleep(1)putempty()返回False



查看完整回答
反对 回复 2023-05-23
  • 3 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信