繁体   English   中英

multiprocessing.Queue - 如果在 `queue.get()` 之前没有调用`queue.empty()`,单个线程会挂在`queue.get()` 上吗?

[英]multiprocessing.Queue - Will a single thread hang on `queue.get()` if not `queue.empty()` is called before `queue.get()`?

文档multiprocessing.Queue().empty()有这样的说法:

如果队列为空,则返回 True,否则返回 False。 由于多线程/多处理语义,这是不可靠的。

假设我有一个调用 queue.get() 的线程/进程,而不是多个消费者。

以下代码是否可以挂在queue.get()

def process_queue(queue):
    while not queue.empty():
        item = queue.get()
        print(f"The item is {item}")

我认为只要您有一个调用process_queue的线程/进程,代码就永远不会挂起。

当然,一旦多个线程/进程调用process_queue ,所有的赌注都被取消了。

如果只有一个消费者,你是对的,那段代码永远不会阻塞在queue.get()上。

请注意,如果上面的代码块碰巧在您的任何生产者能够开始填充队列之前开始运行,或者如果它碰巧耗尽队列而生产者仍有更多项目要添加,则上述代码块将无法按预期工作. 这可能与您的用例无关,但如果是,您可能希望使用哨兵/毒丸来告诉您的消费者何时应该停止检查新项目。 这样,它只会在生产者没有完成生产新项目的情况下阻塞get()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM