0

最近、私はオンラインジャッジシステム(spojのような)を開発する計画を立てました。そして、Pythonでジャッジスクリプトを作成しました。送信されたコードを1つ受け取るたびにフォークし、コードをコンパイルして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()

cpuusagememoryusageによって作成された共有メモリでmultiprocessing.Valueあり、の値memoryusageは12Mです。しかし、を介してtop、私は、サブプロセスが900Kであるのに対し、フォークされたpythonプロセスのメモリ使用量は12Mであることを発見しました。私のコードに何か問題がありますか?英語が下手でごめんなさい。

4

1 に答える 1

3

これはmaxrss、子のRSS使用量の最大値であるために呼び出されます。問題はsubprocess、標準的な方法を使用してサブプロセスを作成することです。最初にフォークし、新しいプロセスID(childpid)を作成し、次にexecv目的のサブプロセスの実行可能ファイル(を変更しないchildpid)を作成します。次にresource、この存続期間中のRSSの最大値を返しますchildpid。この子がPythonのフォークコピーを12MBで実行し、別のプログラムを900Kで実行した場合、結果は12MBになります。

この問題を解決する方法がよくわかりません...

于 2012-12-14T16:46:08.117 に答える