【问题标题】:Multiprocessing Queue empty() function not working reliably in python多处理队列empty()函数在python中不能可靠地工作
【发布时间】:2021-08-12 17:17:23
【问题描述】:

我有一个多进程程序,其中一个进程将许多项目放入队列,然后在完成将项目放入队列后设置一个事件。另一个进程等待该事件,然后在 while 循环中清空队列,如下面的代码所示,使用 empty() 调用进行检查。问题是每隔一段时间(可能是 10 次中的 1 次),当队列中仍有项目时,empty() 返回 True。在 while 循环期间,没有其他进程或线程接触队列。可以在单个过程中使用以下代码重现该问题。大多数时候,输出是:

The size of my_queue initially is 400
The size of my_queue is 0

但每隔一段时间,我会得到类似的东西:

The size of my_queue initially is 400
The size of my_queue is 377

代码如下:

from multiprocessing import Queue as MPQueue

my_list = []
my_queue = MPQueue()
for i in range(0, 400):
    my_queue.put(f"The value of i is {i}")

print(f"The size of my_queue initially is {my_queue.qsize()}")
while not my_queue.empty():
    my_list.append(my_queue.get())
print(f"The size of my_queue is {my_queue.qsize()}")

这是 multiprocessing.Queue 模块中的错误还是我遗漏了什么?我也尝试过使用 get_nowait() 然后捕获 Queue.Empty 异常,但我得到了相同的结果。任何帮助将非常感激。谢谢。

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    我在某个时候遇到了同样的问题。 docs.python.org

    类 multiprocessing.Queue([maxsize])

    qsize():

    返回队列的近似大小。由于 > 多线程/多处理语义,这个数字不可靠

    请注意,这可能会在未实现 sem_getvalue() 的 Unix 平台(如 Mac OS X>)上引发 NotImplementedError。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2015-06-25
      • 2020-04-25
      • 2011-07-20
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多