Python多处理:RuntimeError:"队列对象应该只在进程之间通过继承来共享"

时间:2017-03-07 00:35:41

标签: python queue multiprocessing python-multiprocessing

我知道multiprocessing.Manager()以及它如何用于创建共享对象。特别是,可以在工人之间共享的队列。有question,此question和此question

但是,这些链接没有提到为什么我们可以使用继承来在进程之间共享。据我了解,在这种情况下仍然只能复制一个队列。

1 个答案:

答案 0 :(得分:4)

python中的Queue实现依赖于系统pipe将数据从一个进程传输到另一个进程以及一些semaphores来保护对此pipe的读写操作。

由于操作系统的限制,pipe在进程中作为一个打开的文件处理,并且只能在生成时与子进程共享。
对于早期版本的python,semaphores也被视为只应在产卵时共享的文件,至少在基于UNIX的系统中是这样的。

由于这两个子对象通常无法共享,因此Queue无法被腌制并在启动后发送到子进程。

但是,对于某些操作系统和最新版本的python,可以共享Connection并创建可共享的Semaphore。因此,理论上您可以创建自己的Queue,可以在进程之间共享。但它涉及很多黑客攻击,可能不太安全。