PythonメモリとCPUの使用量を制限する方法(Unixシステム適用)


問題
Unixシステム上で動作するプログラムにメモリやCPUの使用制限を設定したいです。
ソリューション
この二つのタスクを同時に実行することができます。例えば、CPU時間を制限するには、以下のようにしてもよい。

import signal
import resource
import os

def time_exceeded(signo, frame):
 print("Time's up!")
 raise SystemExit(1)

def set_max_runtime(seconds):
 # Install the signal handler and set a resource limit
 soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
 resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
 signal.signal(signal.SIGXCPU, time_exceeded)

if __name__ == '__main__':
 set_max_runtime(15)
 while True:
  pass
プログラムが実行されると、SIGXCPU 信号は時間が切れた時に生成され、クリーンアップを実行して終了します。
メモリ使用を制限するには、使用できる総メモリ値を設定すればいいです。

import resource

def limit_memory(maxsize):
 soft, hard = resource.getrlimit(resource.RLIMIT_AS)
 resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard))
このようにメモリ制限が設定されていると、プログラムが実行されて余分なメモリがない場合はMemoryErrorが投げられます。
討論する
この節の例では、setrlimit() 関数は、特定のリソースの上のソフトリミットおよびハードリミットを設定するために使用される。ソフトリミットは値であり、この値を超えるとオペレーティングシステムは通常、プロセスを制限または通知するために信号を送る。ハードリミットはソフトリミットの設定を指定するための最大値です。通常、これはシステム管理者がシステムレベルのパラメータを設定することによって決定される。ハードリミットは少し小さくしてもいいですが、ユーザープロセスを使って変更しないほうがいいです。setrlimit() 関数は、さらに、サブルーチンの数、ファイルの数、および同様のシステムリソースの制限を設定するために使用される。詳細は resource モジュールのドキュメントを参照してください。
注意したいのは、本节の内容はUnixシステムにしか适用できません。また、全システムが予定通りに动作することは保证されていません。たとえば、私たちはテストの時、Linuxの上で正常に動作しますが、OS Xではできません。
以上がPythonメモリとCPUの使用量を制限する方法の詳細です。Python制限メモリとCPUに関する資料は他の関連記事に注目してください。