我正在使用python的多处理模块,并且对此有一些混淆。
基本上,我最初在Main进程中存储了一些数据,大约是16GB(主内存大小),如top命令所示。我已将这些数据存储为全局变量。
然后对这些数据进行多处理,并相应地进行相应处理。
现在我看到正在进行多处理,即所有进程都有自己的CPU利用率,但所有进程的内存各占16 GB ..为什么如此。是不是应该使用通过全局变量的引用传递的相同内存..请一些想法。
top命令的输出如下: -
PID用户PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND 13908 admin 20 0 16.7g 16g 848 R 100.0 17.3 0:32.92 python
13429 admin 20 0 16.7g 16g 3336 S 0.0 17.3 15:06.97 python
13910 admin 20 0 16.7g 16g 848 R 100.3 17.3 0:32.94 python
13911 admin 20 0 16.7g 16g 840 R 100.0 17.3 0:33.02 python
13912 admin 20 0 16.7g 16g 836 R 99.6 17.3 0:33.00 python
13907 admin 20 0 16.7g 16g 796 R 100.0 17.3 0:33.06 python
13909 admin 20 0 16.7g 16g 796 R 99.6 17.3 0:32.93 python
答案 0 :(得分:2)
将多处理模块视为os.fork()的语法糖。
现在叉子是什么?当进程分叉时,操作系统使用新的进程ID创建一个新的子进程,复制父进程的状态(内存,环境变量等)。
答案 1 :(得分:2)
multiprocessing
模块生成的每个进程都在一个单独的地址空间中。在创建新进程之后,原始进程所拥有的所有物理和虚拟内存至少逻辑独立于新进程,但最初每个新进程都是完全重复的(嗯,请参阅脚注)。旧。因此,每个都将具有与原始虚拟大小相同的虚拟大小(16.7 GB)。
使用“copy-on-write”尽可能地共享实际的底层物理页面。当各种副本运行并对其虚拟内存进行更改时,内核将根据需要复制基础物理页面。永远不会写入的内存可以在所有副本之间共享。因此,尽管每个进程似乎都在攫取大量内存,但事实并非如此。如果你写它的大部分,但是,如果每个单独的进程改变了大部分16 GB的数据 - 那么它们将都有单独的副本,并使用更多的物理RAM。
multiprocessing
模块确实提供了一些共享数据的方法(请参阅http://docs.python.org/library/multiprocessing.html中的“共享内存”部分),如果您希望它们共享修改(但是请考虑锁定是如何工作的;请参阅文件)。