如何解决在 Python 中设置限制并检查 subprocess.Popen 的内存使用情况
我正在 Debian 上使用 Django 开发在线法官。我使用 subprocess.Popen 调用的所有用户脚本。为了检查脚本时间使用情况,我使用时间模块并限制超时我给参数超时以在进程对象上进行通信并处理 subprocess.TimeoutExpired 异常。是否可以做类似的事情来检查进程的内存使用情况并限制它?
这是我现在如何做的代码示例:
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
解决方法
没有直接的单行简单方法来检查内存消耗。
解决方案:
- 您可以使用
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
- 有点复杂恕我直言 - 使用外部流程/软件来监控流程指标
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。