Python 3.x 进程间的python3共享列表对象
我想在进程池中的进程之间共享一个大对象(这是一个str列表)。这个对象是只读的,所以我不想锁定它。 我尝试了multiprocessing.Value,但它似乎只支持ctypes,但我想共享一个str列表 我也尝试过multiprocessing.Manager.list,但是根据文档,这个管理器是一个同步管理器,我想它会锁定它,这不是我想要的Python 3.x 进程间的python3共享列表对象,python-3.x,multiprocessing,python-multiprocessing,Python 3.x,Multiprocessing,Python Multiprocessing,我想在进程池中的进程之间共享一个大对象(这是一个str列表)。这个对象是只读的,所以我不想锁定它。 我尝试了multiprocessing.Value,但它似乎只支持ctypes,但我想共享一个str列表 我也尝试过multiprocessing.Manager.list,但是根据文档,这个管理器是一个同步管理器,我想它会锁定它,这不是我想要的 那么,这样做的最佳做法是什么呢?这取决于您愿意做出哪些权衡。 我可以看到多种方法,各有利弊: 创建一个匿名文件。这些是专门为在使用多处理或os.fork
那么,这样做的最佳做法是什么呢?这取决于您愿意做出哪些权衡。 我可以看到多种方法,各有利弊:
多处理
或os.fork()
创建的进程之间共享而设计的。它们具有较低的开销,并且几乎直接转换为用于共享内存的操作系统原语。缺点是您只会得到一个巨大的固定长度字节数组。如果您想在其上增加额外的结构(例如,字符串列表),则需要手动序列化和反序列化它。您可能会发现和模块对此很有帮助。如果你有冒险的感觉,你也可以通过一个简单的程序来访问这些元素fork()
的写时复制设计应该可以减轻这些性能影响。实际上,这对我们来说没有任何作用,因为Python引用计算字符串,这会写入内存并强制操作系统复制附近的数据<代码>数组不重新计算其内容,因此,如果单个数组足够大,可能不太容易受到此问题的影响tempfile
模块将在完成后为您清理它。然而,从永久存储器读取数据通常比内存解决方案慢这取决于你愿意做出什么样的权衡。 我可以看到多种方法,各有利弊:
多处理
或os.fork()
创建的进程之间共享而设计的。它们具有较低的开销,并且几乎直接转换为用于共享内存的操作系统原语。缺点是您只会得到一个巨大的固定长度字节数组。如果您想在其上增加额外的结构(例如,字符串列表),则需要手动序列化和反序列化它。您可能会发现和模块对此很有帮助。如果你有冒险的感觉,你也可以通过一个简单的程序来访问这些元素fork()
的写时复制设计应该可以减轻这些性能影响。实际上,这对我们来说没有任何作用,因为Python引用计算字符串,这会写入内存并强制操作系统复制附近的数据<代码>数组不重新计算其内容,因此,如果单个数组足够大,可能不太容易受到此问题的影响tempfile
模块将在完成后为您清理它。然而,从永久存储器读取数据通常比内存解决方案慢