最近,我计划开发一个在线评委系统(如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,我发现派生的python进程的内存使用量是12M,而子进程是900K。我的代码有什么问题吗?对不起,我的英语不好。
发布于 2012-12-15 00:46:08
问题是subprocess使用标准的方法创建子进程:它首先派生,创建一个新的进程id (childpid),然后execv目标进程的可执行文件(这不会改变childpid)。如果这个孩子同时运行一个12MB的Python分支副本和另一个900K的程序,那么结果就是12MB。
我真的不知道如何解决这个问题...
https://stackoverflow.com/questions/13880724
复制相似问题