最近我制定了一个开发在线评判系统的计划(如spoj)。我在python中编写了一个判断脚本。它每次收到一个提交的代码时都会分叉,然后编译代码并使用subprocess.Popen
启动程序。但是当我使用resource.getrusage(resource.RUSAGE_CHILDREN)
得到程序的内存使用时,它会返回分叉的python进程而不是子进程的内存。
以下是我的一些代码:
try:
programThread = subprocess.Popen(command, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, preexec_fn = self.limit, bufsize = -1)
except OSError:
self.status.value = -2
return -2
self.JudgeID.value = programThread.pid
programOutput = programThread.communicate(_in)
self.status.value = 0
Res = resource.getrusage(resource.RUSAGE_CHILDREN)
self.cpuusage.value = Res.ru_utime + Res.ru_stime
self.memoryusage.value = Res.ru_maxrss * resource.getpagesize()
cpuusage
和memoryusage
是由multiprocessing.Value
创建的共享内存,memoryusage
的值为12M。但通过top
,我发现,forked python进程的内存使用量为12M,而子进程为900K。我的代码有什么问题吗?抱歉我的英语不好。
答案 0 :(得分:3)
这称为maxrss
,因为它是孩子RSS使用的最大值。问题是subprocess
使用标准方法来创建子流程:它首先分叉,创建一个新的进程id(childpid
),然后execv
预期的子进程'可执行文件(它不会不要改变childpid
)。然后resource
返回此childpid
生命周期内RSS的最大值。如果这个孩子同时运行12MB的Python分叉副本和900K的另一个程序,那么结果就是12MB。
我真的没有看到如何解决这个问题...