【问题标题】:Returning large objects from child processes in python multiprocessing从python多处理中的子进程返回大对象
【发布时间】:2014-10-22 18:07:36
【问题描述】:

我正在使用 Python 多处理来产生一些工人。它们中的每一个都应该返回一个大小为几 MB 的数组。

  1. 由于我的返回数组是在子进程中创建的,是否需要在进程结束时将其复制回父内存中? (这似乎需要一段时间,但它可能是一个 pypy 问题)
  2. 是否有一种机制允许父和子访问相同的内存对象? (同步不是问题,因为只有一个孩子可以访问每个对象)

恐怕我在 python 如何实现多处理方面存在一些差距,试图说服 pypy 玩得好并不会让事情变得更容易。谢谢!

【问题讨论】:

    标签: python multiprocessing pypy python-multiprocessing


    【解决方案1】:

    是的,如果返回数组是在子进程中创建的,则必须通过酸洗将其发送到父进程,通过Pipe 将酸洗后的字节发送回父进程,然后在父进程中取消酸洗对象。对于大型对象,这在 CPython 中相当慢,所以这不仅仅是 PyPy 的问题。不过,PyPy 中的性能可能更差;我没有尝试比较两者,但this PyPy bug 似乎表明 PyPy 中的 multiprocessing 比 CPython 中的慢。

    在 CPython 中,有一种方法可以通过 multiprocessing.sharedctypes 在共享内存中分配 ctypes 对象。 PyPy 似乎也支持这个 API。限制(显然)是您仅限于 ctypes 对象。

    还有multiprocessing.Manager,它允许您在Manager 进程中创建一个共享数组/列表对象,然后父子进程都可以通过Proxy 对象访问共享列表。缺点是对象的读/写性能比作为本地对象慢得多,或者即使它是使用multiprocessing.sharedctypes 创建的大致等效的对象。

    【讨论】:

    • 哇,嗯,这是一个非常完整的答案。非常感谢。我要试试sharedctypes,这可能确实有帮助。
    猜你喜欢
    • 2020-06-19
    • 2021-03-27
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多