Ограничить количество итераций цикла в python

Делаю проверку сайта с курсами и нужно проверять пользовательский код. Сделал сервер для принятия и выполнения кода от пользователей и обернул его в докер контейнер. Вопрос в следующем: если на сервер придет бесконечный цикл (например, while True: 1+1), как я могу установить количество итераций, после которого будет вылезать исключение?

import re
from flask import Flask, jsonify, request
from loguru import logger
import tempfile
import subprocess
from os.path import abspath
from os import remove

app = Flask(__name__)

@app.route('/exec', methods=['POST'])
def execute_task():    
    request_data = request.get_json()
    with tempfile.TemporaryFile() as stdin:
        code_file = open(request_data["uid"], "w")
        valid_src = code_validate(request_data["src"])
        code_file.write(valid_src)
        code_file.close()
        data = "\n".join(list(map(str, request_data["input"])))
        logger.debug(data)
        stdin.write(bytes(data, encoding='utf8'))
        stdin.seek(0)
        try:
            p = subprocess.run(
                        ["python", abspath(code_file.name)],
                        stdin=stdin, stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT,
                        encoding='utf-8',
                        universal_newlines=True,
                        timeout=15
                    )
            output = p.stdout
            remove(abspath(code_file.name))
        except Exception as error:
            remove(abspath(code_file.name))
            if type(error) == subprocess.TimeoutExpired:
                output = "Time Out"
            else:
                raise error
            
        logger.debug(output)
        
        resoult = {
            "input" : request_data["input"],
            "output" : output
        }
        return jsonify(resoult)

def code_validate(src):
    match = re.search(r"^import (?!math)\S+", src)
    if match:
        src = "raise Exception('Illegal import')"
    return src

if __name__ == '__main__':
    app.run(debug=True, use_reloader=True, host="0.0.0.0", port=5000)

Ответы (1 шт):

Автор решения: wowlikon

В функции есть параметр timeout. Возможно это поможет в решении этой проблемы. subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs) Subprocess

→ Ссылка