我想在进程池中的进程之间共享进程(这是str列表的列表)之间的大对象。该对象是只读的,所以我不想锁定它。 我已经尝试过multiprocessing.Value,但它似乎只支持ctypes,但我想共享一个str列表列表。
我也尝试过multiprocessing.Manager.list,但是根据文档,经理是一个同步管理器,我想它会锁定它,这不是我想要的。
那么这样做的最佳做法是什么?
答案 0 :(得分:2)
这取决于您愿意做出的权衡。
我可以看到多种方法,有利有弊:
mmap
。这些专门设计为在使用ProcessPoolExecutor
或multiprocessing
创建的流程之间共享。它们的开销很低,几乎直接转换为共享内存的操作系统原语。缺点是你只需要一个巨大的固定长度字节数组。如果您希望在其上添加其他结构(例如,字符串列表列表),则需要手动序列化和反序列化它。您可能会发现struct
和array
模块对此有用。如果您喜欢冒险,您还可以通过memoryview
object就地访问这些元素。os.fork()
的写时复制设计来缓解。在实践中,这对我们没有任何作用,因为Python引用计算字符串,这些字符串写入内存并强制操作系统复制附近的数据。如果您的个别数组足够大,fork()
不会重新计算其内容,因此可能不太容易受到此问题的影响。tempfile
创建一个临时文件,并使用json
,pickle
或sqlite3
将信息存储在那里。我们可以假设临时文件对子进程也是可见的,array
模块将在完成后为您清理它。但是,从永久存储中读取数据通常比内存解决方案慢。