Остановка python -оболочки, если скрипт имеет бесконечный цикл - PullRequest
0 голосов
/ 23 апреля 2020

Я работаю над приложением Node.js, которое принимает отправленный код Python и запускает тестовые наборы для этих представлений. Я использовал пакет python -shell для запуска Python в Node.js. Когда заявки не проходят или проходят тестовые случаи, все в порядке. Проблема возникает, когда скрипт Python содержит бесконечный l oop. В этом случае экземпляр оболочки python никогда не завершается.
Я проверил некоторые из уже заданных вопросов о переполнении стека, например Как установить ограничение времени для запуска асинхронной функции в node.js? , Запуск и остановка Python Скрипт из NodeJS? и Как я могу остановить PythonShell , но, похоже, ничто не имеет дело с бесконечными циклами внутри скриптов. Я хочу прекратить работу моего judRoutine (), если обещание не будет выполнено в течение нескольких секунд. Я пытался использовать тайм-аут и обещания для решения проблемы, но пока безрезультатно. Я включаю код, который у меня есть:

//judge.js
const {PythonShell} = require('python-shell')

const fs = require('fs');

function judgeRoutine(){
    let output=""
    return new Promise(function(resolve, reject){
        PythonShell.run('./test.py', null,function(err, result){
            if(err){
                return err
            }
            output = result[1]
            console.log(output)

            //perform DB operations based on output value

            return resolve(output)
        })
        setTimeout(function(){if (output===""){
            return reject(new Error("Time out"));
        }
        else{
            resolve(output)
        }} ,1000)
    })
    .catch(err => console.log(err))
}

function runJudge(){
    new Promise(function(resolve, reject){
        //copy scripts into the folder
        //solution2.py contains an endless loop
        fs.copyFile('./submissions/solution2.py', './solution.py', (err) => {
            if (err) throw err;
            console.log('File was copied to destination');
        });

        fs.copyFile('./tests/test35345.py', './test.py', (err) => {
            if (err) throw err;
            console.log('File was copied to destination');
        })    
    }).then(judgeRoutine()).then(value => console.log("resolve value", value)).catch(err=> {if (err.name==="Time out"){
        reject("Time out")
    }})
}

module.exports={runJudge}

Я был бы рад получить любые предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...