2012-12-14 5 views
0

최근 온라인 판사 시스템 (예 : 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() 

cpuusagememoryusagemultiprocessing.Value 만든 메모리 공유를 memoryusage의 값은 12M입니다. 그러나 top을 통해 fork 된 파이썬 프로세스의 메모리 사용량이 12M이고 서브 프로세스가 900K 인 것을 발견했습니다. 내 코드에 문제가 있습니까? 내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다.

답변

3

이것은 어린이의 RSS 사용 최대치이기 때문에 maxrss이라고합니다. 문제는 subprocess이 표준 프로세스를 사용하여 하위 프로세스를 생성한다는 것입니다. 먼저 새 프로세스 ID (childpid)를 생성 한 다음 execv 하위 프로세스의 실행 파일 (childpid을 변경하지 않음)을 생성합니다. 그런 다음 resource은이 childpid의 수명 중 RSS 최대 값을 반환합니다. 이 자식이 12MB에서 분기 된 Python 복사본과 900K에서 다른 프로그램을 모두 실행 한 경우 결과는 12MB입니다. 난 정말이 문제를 해결하는 방법을 볼 수 없습니다

...

+1

당신은, 파이썬 자체가 실제 프로세스를 실행 C로 작성된 작은 래퍼 프로그램에서 실행해야 할 수 있습니다 가져 마침내 그것을 위해 대기하고, RUSAGE_CHILDREN. 이 방법으로보고 된 값은 파이썬과 실제 프로그램이 취한 최대 크기가 아니라이 작은 래퍼 프로그램과 실제 프로그램이 취한 최대 크기입니다. –