[英]Set limit and check memory usage of subprocess.Popen in Python
我正在使用 Debian 上的 Django 开发在线法官。 我用 subprocess.Popen 调用的所有用户脚本。 要检查脚本时间使用情况,我使用时间模块并限制超时,我提供参数超时以在进程 object 上进行通信并处理 subprocess.TimeoutExpired 异常。 是否可以做类似检查 memory 进程使用情况并限制它的事情?
这是我现在如何做的代码示例:
try:
execution = subprocess.Popen(execute_line.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=False)
execution.stdin.write(bytes(test.input_data, 'UTF-8'))
execution.stdin.flush()
start_time = time.time()
test_output, test_error_string = execution.communicate(timeout=time_limit)
end_time = time.time()
finish_time = end_time - start_time
test_output = test_output.decode('utf-8')
test_error_string = test_error_string.decode('utf-8')
except subprocess.TimeoutExpired:
end_time = time.time()
finish_time = end_time - start_time
没有直接的单行简单方法来检查 memory 消耗。
解决方案:
psutil
( pip install psutil ),例如:def get_process_memory():
process = psutil.Process(os.getpid())
return process.memory_info().rss
def track(func):
def wrapper(*args, **kwargs):
mem_before = get_process_memory() / 1024 ** 2
start = time.time()
result = func(*args, **kwargs)
elapsed_time = elapsed_since(start)
mem_after = get_process_memory() / 1024 ** 2
metrics = {
'callable': func.__name__,
'memory_before': mem_before,
'memory_after': mem_after,
'memory_used': mem_after - mem_before,
'exec_time': elapsed_time
}
print(f"{json.dumps(metrics, indent=4)}")
return result
return wrapper
resource
Python 库(仅适用于 Unix 系统) # Memory consumption with psutil (MB)
import os, psutil; print(psutil.Process(os.getpid()).memory_info().rss / 1024 ** 2)
# Memory consumption with resource (MB) - Only works on Unix
import resource; print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024)
tracemalloc
- 更复杂的恕我直言
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.