multiprocessing.Queue 奇怪的 python 行为

Posted

技术标签:

【中文标题】multiprocessing.Queue 奇怪的 python 行为【英文标题】:multiprocessing.Queue weird python behavior 【发布时间】:2020-10-22 03:59:15 【问题描述】:

我坚持理解非常简单的案例。 请,有人可以解释或指示理解以下内容的方向:

import multiprocessing as mp

if __name__ == '__main__':
    input_queue = mp.Queue()
    for i in range(5):
        input_queue.put([i]*5)
    print(input_queue.qsize())
    while not input_queue.empty():
        o = input_queue.get()
        print(o)

输出:

5
[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]
[2, 2, 2, 2, 2]
[3, 3, 3, 3, 3]
[4, 4, 4, 4, 4]

但是:

import multiprocessing as mp

if __name__ == '__main__':
    input_queue = mp.Queue()
    for i in range(5):
        input_queue.put([i]*5)
    # print(input_queue.qsize())
    while not input_queue.empty():
        o = input_queue.get()
        print(o)

什么都不输出

更新:

import multiprocessing as mp

if __name__ == '__main__':
    input_queue = mp.Queue()
    for i in range(5):
        input_queue.put([i]*5)
    for _ in range(5):
        o = input_queue.get()
        print(o)

打印预期输出。所以可能是 .empty() 方法中的问题。

python --version
Python 3.6.9 :: Anaconda, Inc.

【问题讨论】:

我从第二种情况得到了与预期相同的输出(减去队列大小)。也许您的打印输出目标有问题? 我不这么认为,因为在其他情况下是预期的。我用一个例子更新了我的问题。 【参考方案1】:

您可能正在点击this

将对象放入空队列后,队列的 empty() 方法返回 False 之前可能会有一个无限小的延迟

你可以试试在while not input_queue.empty():之前的那一行加一个sleep吗?

import multiprocessing as mp
import time

if __name__ == '__main__':
    input_queue = mp.Queue()
    for i in range(5):
        input_queue.put([i]*5)
    # print(input_queue.qsize())
    time.sleep(1)
    while not input_queue.empty():
        o = input_queue.get()
        print(o)

如果上述方法有效,那么您在第一个示例中的 print(input_queue.qsize()) 调用就是给队列足够的时间来腌制对象并开始在 empty() 调用上返回 False

【讨论】:

乐于助人!你也能“接受”这个答案吗?谢谢

以上是关于multiprocessing.Queue 奇怪的 python 行为的主要内容,如果未能解决你的问题,请参考以下文章

跨衍生进程复制“multiprocessing.Queue”

Python multiprocessing.Queue 和 Queue有区别吗

无法使用 multiprocessing.Queue 存储代理

Python multiprocessing.Queue 未接收来自分叉进程的放置

在luigi中使用multiprocessing.Queue

当不同的进程不通信时,是不是应该将不同的 multiprocessing.Queue 对象用于不同的进程?