최근 온라인 판사 시스템 (예 : spoj)을 개발할 계획을 세웠습니다. 그리고 파이썬으로 판사 스크립트를 작성했습니다. 그것은 하나의 제출 된 코드를 수신 할 때마다 작성한 다음 코드를 컴파일하고 subprocess.Popen
을 사용하여 프로그램을 시작합니다. 그러나 프로그램의 메모리 사용량이 resource.getrusage(resource.RUSAGE_CHILDREN)
일 때, 서브 프로세스 대신 fork 된 파이썬 프로세스의 메모리를 반환합니다.RUSAGE_CHILDREN을 사용하는 Python getrusage가 비정상적으로 작동합니까?
아래는 내 코드의 일부입니다 :
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
을 통해 fork 된 파이썬 프로세스의 메모리 사용량이 12M이고 서브 프로세스가 900K 인 것을 발견했습니다. 내 코드에 문제가 있습니까? 내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다.
당신은, 파이썬 자체가 실제 프로세스를 실행 C로 작성된 작은 래퍼 프로그램에서 실행해야 할 수 있습니다 가져 마침내 그것을 위해 대기하고, RUSAGE_CHILDREN. 이 방법으로보고 된 값은 파이썬과 실제 프로그램이 취한 최대 크기가 아니라이 작은 래퍼 프로그램과 실제 프로그램이 취한 최대 크기입니다. –