Python 3.x 进程间的python3共享列表对象

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

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

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


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

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

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

  • 创建一个匿名文件。这些是专门为在使用
    多处理
    os.fork()
    创建的进程之间共享而设计的。它们具有较低的开销,并且几乎直接转换为用于共享内存的操作系统原语。缺点是您只会得到一个巨大的固定长度字节数组。如果您想在其上增加额外的结构(例如,字符串列表),则需要手动序列化和反序列化它。您可能会发现和模块对此很有帮助。如果你有冒险的感觉,你也可以通过一个简单的程序来访问这些元素
  • 不要共享列表。子进程已经继承父进程内存中任何内容的副本。由于列表是只读的,这可能会影响性能,但不会产生错误的结果。从理论上讲,现代操作系统的
    fork()
    的写时复制设计应该可以减轻这些性能影响。实际上,这对我们来说没有任何作用,因为Python引用计算字符串,这会写入内存并强制操作系统复制附近的数据<代码>数组不重新计算其内容,因此,如果单个数组足够大,可能不太容易受到此问题的影响
  • 使用创建临时文件,并使用或在其中存储信息。我们可以假设临时文件对子进程也是可见的,并且
    tempfile
    模块将在完成后为您清理它。然而,从永久存储器读取数据通常比内存解决方案慢

  • 这取决于你愿意做出什么样的权衡。

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

  • 创建一个匿名文件。这些是专门为在使用
    多处理
    os.fork()
    创建的进程之间共享而设计的。它们具有较低的开销,并且几乎直接转换为用于共享内存的操作系统原语。缺点是您只会得到一个巨大的固定长度字节数组。如果您想在其上增加额外的结构(例如,字符串列表),则需要手动序列化和反序列化它。您可能会发现和模块对此很有帮助。如果你有冒险的感觉,你也可以通过一个简单的程序来访问这些元素
  • 不要共享列表。子进程已经继承父进程内存中任何内容的副本。由于列表是只读的,这可能会影响性能,但不会产生错误的结果。从理论上讲,现代操作系统的
    fork()
    的写时复制设计应该可以减轻这些性能影响。实际上,这对我们来说没有任何作用,因为Python引用计算字符串,这会写入内存并强制操作系统复制附近的数据<代码>数组不重新计算其内容,因此,如果单个数组足够大,可能不太容易受到此问题的影响
  • 使用创建临时文件,并使用或在其中存储信息。我们可以假设临时文件对子进程也是可见的,并且
    tempfile
    模块将在完成后为您清理它。然而,从永久存储器读取数据通常比内存解决方案慢