Python multiprocessing: RuntimeError: "Queue objects should only be shared between processes through inheritance"
Python multiprocessing: RuntimeError: "Queue objects should only be shared between processes through inheritance"
我知道 multiprocessing.Manager() 以及如何使用它来创建共享对象。特别是可以在工作人员之间共享的队列。有这个question, this question, and this question.
但是,这些链接没有提到为什么我们可以使用继承来实现进程之间的共享。据我了解,在这种情况下仍然只能复制队列。
python 中的 Queue
实现依赖系统 pipe
将数据从一个进程传输到另一个进程,一些 semaphores
来保护读写这个pipe
。
由于 OS 限制,pipe
在进程中作为打开的文件处理,只能在生成时与子进程共享。
semaphores
也被视为仅应在生成时共享的文件,至少在基于 UNIX 的系统中,对于 python.
的早期版本
由于这 2 个子对象通常不能共享,所以 Queue
一旦启动就不能被 pickle 并发送到子进程。
但是,对于某些 OS 和最新版本的 python,可以共享 Connection
并创建可共享的 Semaphore
。因此,理论上您可以创建自己的 Queue
并在进程之间共享。但它涉及很多黑客攻击,可能不是很安全。
我知道 multiprocessing.Manager() 以及如何使用它来创建共享对象。特别是可以在工作人员之间共享的队列。有这个question, this question, and this question.
但是,这些链接没有提到为什么我们可以使用继承来实现进程之间的共享。据我了解,在这种情况下仍然只能复制队列。
python 中的 Queue
实现依赖系统 pipe
将数据从一个进程传输到另一个进程,一些 semaphores
来保护读写这个pipe
。
由于 OS 限制,pipe
在进程中作为打开的文件处理,只能在生成时与子进程共享。
semaphores
也被视为仅应在生成时共享的文件,至少在基于 UNIX 的系统中,对于 python.
由于这 2 个子对象通常不能共享,所以 Queue
一旦启动就不能被 pickle 并发送到子进程。
但是,对于某些 OS 和最新版本的 python,可以共享 Connection
并创建可共享的 Semaphore
。因此,理论上您可以创建自己的 Queue
并在进程之间共享。但它涉及很多黑客攻击,可能不是很安全。