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。

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