多处理模块显示每个子进程的内存与主进程相同。

gee*_*eek 3 python linux memory-management

我正在使用 python 的多处理模块,对此有一些困惑。

基本上,我最初在主进程中存储一些数据,大约为 16GB(主内存大小),如 top 命令所示。我已将这些数据存储为全局变量。

然后对这些数据进行多重处理,并相应地进行不同的处理。

现在我看到正在发生多处理,即所有进程都有自己的 CPU 利用率,但所有进程的内存均为 16 GB。为什么会这样。?难道它不应该使用我通过全局变量的引用传递发送的相同内存吗?请一些想法。

top命令的输出如下:-

PID用户PR NI VIRT RES SHR S%CPU%MEM时间+命令13908管理20 0 16.7g 16g 848 R 100.0 17.3 0:32.92 python 13429管理20 0 16.7g 16g
3336 S 0.0 17.3 15:06.97 python 13
910管理20 0 16.7克16g 848 R 100.3 17.3 0:32.94 python
13911 管理 20 0 16.7g 16g 840 R 100.0 17.3 0:33.02 python 13912 管理 20
0 16.7g 16g 836 R 99.6 17.3 0:33.00 python 1
3907 管理 20 0 16.7g 16g 796 R 100.0 17.3 0:33.06 python
13909 管理 20 0 16.7g 16g 796 R 99.6 17.3 0:32.93 python

tor*_*rek 6

该模块生成的每个进程都multiprocessing位于单独的地址空间中。创建新进程后,原始进程拥有的所有物理和虚拟内存至少在逻辑上独立于新进程,但最初每个新进程都是旧进程的精确复制(好吧,请参见脚注)。因此,每个文件都将具有与原始文件相同的虚拟大小 (16.7 GB)。

\n\n

使用“写时复制”尽可能多地共享实际的底层物理页。当各种副本运行并对其虚拟内存进行更改时,内核将根据需要复制底层物理页。从未写入的内存可以在所有副本之间共享。因此,尽管每个进程看起来都在消耗大量 RAM,但实际上并非如此。如果您写入其中的大部分内容,尽管 \xe2\x80\x94 即,如果每个单独的进程都更改了 16 GB 数据的大部分\xe2\x80\x94,那么它们都将拥有单独的副本,并使用更多的物理 RAM 。

\n\n

如果您希望它们共享修改,该模块确实提供了一些共享数据的方法(请参阅http://docs.python.org/library/multiprocessing.htmlmultiprocessing中的“共享内存”部分)(但请考虑锁定如何工作) ; 请参阅文档)。\n


\n脚注:在 fork 或克隆系统调用之后,原始版本和克隆版本之间存在一个微小的差异:原始版本返回克隆的 ID,而克隆版本返回数字零。

\n