我正在尝试在Python中在父进程和子进程之间共享对象。为了玩弄这个想法,我创建了一个简单的Python脚本:
from multiprocessing import Process
from os import getpid
import psutil
shared = list(range(20000000))
def shared_printer():
mem = psutil.Process(getpid()).memory_info().rss / (1024 ** 2)
print(getpid(), len(shared), '{}MB'.format(mem))
if __name__ == '__main__':
p = Process(target=shared_printer)
p.start()
shared_printer()
p.join()
这段代码片段使用了优秀的psutil库来打印RSS(驻留集大小)。当我在带有Python 2.7.15的OSX上运行它时,我得到以下输出:
(33101, 20000000, '1MB')
(33100, 20000000, '626MB')
当我在Ubuntu上运行完全相同的代码片段(Linux 4.15.0-1029-aws#30-Ubuntu SMP x86_64 GNU / Linux),我会得到以下输出:
(4077, 20000000, '632MB')
(4078, 20000000, '629MB')
注意,在OSX上,子进程的RSS基本为0MB,而在Linux中,子进程的RSS大小与父进程的相同。我曾经认为,写时复制行为在Linux中也会以同样的方式工作,并允许子进程引用父进程的大多数页面内存(也许除了存储对象头的页面)。因此,我猜想这两个系统在写时复制行为上存在某些差异。我的问题是:在Linux中是否有任何方法可以实现类似于OSX的写时复制行为?
.pyc
文件是在安装时还是在运行时生成,但无论哪种方式,它都不应该影响fork
的行为。 - ShadowRangerhost_statistics
(由psutil
使用)以及答案,解释了为什么其结果在不同平台上不一致。 - sytech