Я работаю над приложением 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}
Я был бы рад получить любые предложения.