python3进程间的共享列表对象

时间:2018-04-07 02:15:22

标签: python-3.x multiprocessing python-multiprocessing

我想在进程池中的进程之间共享进程(这是str列表的列表)之间的大对象。该对象是只读的,所以我不想锁定它。 我已经尝试过multiprocessing.Value,但它似乎只支持ctypes,但我想共享一个str列表列表。

我也尝试过multiprocessing.Manager.list,但是根据文档,经理是一个同步管理器,我想它会锁定它,这不是我想要的。

那么这样做的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

这取决于您愿意做出的权衡。

我可以看到多种方法,有利有弊:

  1. 创建匿名mmap。这些专门设计为在使用ProcessPoolExecutormultiprocessing创建的流程之间共享。它们的开销很低,几乎直接转换为共享内存的操作系统原语。缺点是你只需要一个巨大的固定长度字节数组。如果您希望在其上添加其他结构(例如,字符串列表列表),则需要手动序列化和反序列化它。您可能会发现structarray模块对此有用。如果您喜欢冒险,您还可以通过memoryview object就地访问这些元素。
  2. 不要分享名单。子进程已经在父进程的内存中继承了任何内容的副本。由于列表是只读的,因此可能会影响性能,但不会产生不正确的结果。从理论上讲,这些性能影响应该通过现代操作系统os.fork()的写时复制设计来缓解。在实践中,这对我们没有任何作用,因为Python引用计算字符串,这些字符串写入内存并强制操作系统复制附近的数据。如果您的个别数组足够大,fork()不会重新计算其内容,因此可能不太容易受到此问题的影响。
  3. 使用tempfile创建一个临时文件,并使用jsonpicklesqlite3将信息存储在那里。我们可以假设临时文件对子进程也是可见的,array模块将在完成后为您清理它。但是,从永久存储中读取数据通常比内存解决方案慢。