首页 > 解决方案 > Python multiprocessing.Manager().Queue():尝试加入进程时出现死锁

问题描述

我正在实现一个多处理的网络爬虫。我使用 Manager().Queue() 创建了一个爬虫将下载的文件名队列。所有进程共享同一个队列,并且它们也在队列上执行 put() 和 get() 操作。当我读到 Queue() 类时,它是线程安全的,可以使我的队列成为阻塞队列,这解决了进程试图从空队列中获取 () 项目的问题。但是,另一个问题出现了:当队列最终只有少数项目时,某个进程,比如进程 1,检测到它是非空的,然后所有这些项目都被另一个进程,比如进程 2 弹出,然后进程 1 尝试get() 队列中的一个项目,但发现它是空的,因此它的 get() 调用将永远阻塞。

尝试的解决方案:允许 get() 超时,所以当超时发生时,get() 将引发“队列空”异常,然后让进程退出

但似乎这个解决方案行不通,因为有时程序会卡在 process.join() 阶段。

有人可以帮我吗?我的英语不是那么好,但如果你能考虑一下这个问题,我将不胜感激。谢谢你。

标签: pythonqueuemultiprocessingdeadlock

解决方案


推荐阅读