首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python getrusage和RUSAGE_CHILDREN的行为很奇怪吗?

Python getrusage和RUSAGE_CHILDREN的行为很奇怪吗?
EN

Stack Overflow用户
提问于 2012-12-14 22:35:41
回答 1查看 1.4K关注 0票数 0

最近,我计划开发一个在线评委系统(如spoj)。我已经用python写了一个裁判脚本。每次收到一个提交的代码时,它都会派生,然后编译代码并使用subprocess.Popen启动程序。但是当我用resource.getrusage(resource.RUSAGE_CHILDREN)获取程序的内存使用量时,它返回的是派生的python进程的内存,而不是子进程。

下面是我的一些代码:

代码语言:javascript
复制
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,我发现派生的python进程的内存使用量是12M,而子进程是900K。我的代码有什么问题吗?对不起,我的英语不好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-15 00:46:08

问题是subprocess使用标准的方法创建子进程:它首先派生,创建一个新的进程id (childpid),然后execv目标进程的可执行文件(这不会改变childpid)。如果这个孩子同时运行一个12MB的Python分支副本和另一个900K的程序,那么结果就是12MB。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13880724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档