繁体   English   中英

设置限制并检查 memory 子进程的使用情况。Python 中的 Popen

[英]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 消耗。

解决方案:

  1. 您可以使用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
  1. 使用类似的方法,包括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)
  1. 使用tracemalloc - 更复杂的恕我直言
  2. 使用外部流程/软件来监控流程的指标

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM