【问题标题】:python multiprocessing arguments: deep copy?python多处理参数:深拷贝?
【发布时间】:2011-08-24 09:35:19
【问题描述】:
from multiprocessing import Process
# c is a container
p = Process(target = f, args = (c,))
p.start()

我假设c 的深拷贝被传递给函数f,因为浅拷贝在新进程的情况下没有意义(新进程无法访问来自调用进程的数据) .

但是这个深拷贝是如何定义的呢?在copy.deepcopy() 文档中有一个完整的set of notes,所有这些注释是否也适用于这里? multiprocessing 文档什么也没说...

【问题讨论】:

    标签: python multiprocessing deep-copy


    【解决方案1】:

    当您创建Process 实例时,Python 会在后台发出fork()。这将创建一个子进程,其内存空间是其父进程的精确副本——因此在分叉时存在的所有内容都被复制

    在 Linux 上,这是通过“写时复制”来提高效率的。来自fork man page

    fork() 创建一个子进程 仅与父进程不同 在它的 PID 和 PPID 中,事实上 资源利用率设置为 0. 文件锁和挂起信号不被继承。

    Linux下实现fork() 使用写时复制页面,所以唯一的 它招致的惩罚是时间和 复制所需的内存 父的页表,并创建一个 孩子的独特任务结构。

    【讨论】:

    • +1。请注意,Windows 使用的机制与 fork() 不同,但效果相似。
    • 这是正确的,但必须提到的是,没有任何东西被复制是不正确的。 Python 的垃圾收集器需要维护引用计数。不过,这样做的内存开销可以忽略不计(我认为每个进程需要 4kb)。
    • 以上旧信息:来自python docs: > 3.4 版更改:在所有unix 平台上添加了spawn,并为一些unix 平台添加了forkserver。子进程不再继承 Windows 上的所有父进程可继承句柄。
    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多