0

最近我计划开发一个在线裁判系统(如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,其值为memoryusage12M。但是通过top,我发现,分叉的python进程的内存使用量是12M,而子进程是900K。我的代码有什么问题吗?对不起,我的英语不好。

4

1 回答 1

3

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

我真的不知道如何解决这个问题......

于 2012-12-14T16:46:08.117 回答