使用RUSAGE_CHILDREN的Python getrusage表现得很好?

时间:2012-12-14 14:35:41

标签: python getrusage

最近我制定了一个开发在线评判系统的计划(如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()

cpuusagememoryusage是由multiprocessing.Value创建的共享内存,memoryusage的值为12M。但通过top,我发现,forked python进程的内存使用量为12M,而子进程为900K。我的代码有什么问题吗?抱歉我的英语不好。

1 个答案:

答案 0 :(得分:3)

这称为maxrss,因为它是孩子RSS使用的最大值。问题是subprocess使用标准方法来创建子流程:它首先分叉,创建一个新的进程id(childpid),然后execv预期的子进程'可执行文件(它不会不要改变childpid)。然后resource返回此childpid生命周期内RSS的最大值。如果这个孩子同时运行12MB的Python分叉副本和900K的另一个程序,那么结果就是12MB。

我真的没有看到如何解决这个问题...