我有一个片段,使用了multiprocess
模块中的Queue
类。我很困惑一个Queue
实例的.empty()
方法没有给出我期望的正确值。以下是我的代码:
from time import sleep
from multiprocessing import Queue, Lock
foo = Queue()
locker = Lock()
with locker: # even with this, still True
foo.put("bar")
print(foo.empty()) # True, obviously not
print(foo.empty()) # True
print(foo.empty()) # True
print(foo.qsize()) # 1L
print(foo.empty()) # True
然而,如果我使用
time
的sleep
函数,即在执行过程中引起一定的时间延迟。 它可以正常工作。from time import sleep
from multiprocessing import Queue, Lock
foo = Queue()
locker = Lock()
foo.put("bar")
sleep(0.01)
print(foo.empty()) # False
print(foo.empty()) # False
print(foo.empty()) # False
print(foo.qsize()) # 1L
print(foo.empty()) # False
我知道我的替代方案是
.qsize() > 0
表达式,但我确定我做错了。我做错了什么?*编辑*
我现在明白它是不可靠的了,谢谢 @Mathias Ettinger。有没有更好的替代方案?我需要可靠地知道我的
Queue
是否为空。
empty()
、full()
和qsize()
都是可靠的。 参考链接 - 301_Moved_Permanentlyput
和get
;empty
仅用于近似统计。在处理节点中,我会使用get(block=False)
立即查看队列是否为空或获取一项工作。 - 9000