擅长:python、mysql、java
<p>进程之间共享内存通常不是一个好主意;当调用<code>os.fork()</code>时,操作系统将父进程使用的和子进程继承的所有内存标记为“写入时复制”;如果任一进程试图修改页,则会将其复制到两个进程之间不共享的新位置。在</p>
<p>这意味着通常的线程原语(锁、条件变量等)不可用于跨进程边界的通信。在</p>
<p>有两种方法可以解决这个问题;首选的方法是使用管道,并序列化两端的通信。布莱恩·凯恩的答案,使用<code>multiprocessing.Queue</code>,就是这样工作的。因为管道没有任何共享状态,并且使用了内核提供的健壮的ipc机制,所以进程不太可能以不一致的状态结束。在</p>
<p>另一个选择是以一种特殊的方式分配一些内存,这样操作系统将允许您使用共享内存。最自然的方法是使用<code>mmap</code>。cPython不会为本机python对象使用共享内存,因此您仍然需要整理如何使用这个共享区域。一个合理的库是numpy,它可以将非类型化的二进制内存区域映射到某种有用的数组中。但是,在管理并发性方面,共享内存要难得多;因为没有简单的方法让一个进程知道另一个进程是如何访问共享区域的。这种方法唯一有意义的时候是当少数进程需要共享大量数据时,因为共享内存可以避免通过管道复制数据。在</p>