2015-06-06 2 views
1

Я хочу запустить некоторые запланированные задания. Эти задания могут занять много времени, и я хочу дать им тайм-аут. Когда функция уже работает в течение 60 секунд, немедленно прекратите выполнение функции и все вызовы этой функции.Выполнение стоп-функции от внешнего закрытия?

var x = function(){ 
    /* doing something for eventually a looong time */ 
} 

x.kill() 

Возможно ли это?

+0

Вы думали об использовании [Web Workers] (https://developer.mozilla.org/en- США/документы/Web/API/Web_Workers_API/Using_web_workers)? –

+0

@AlexMcMillan Я никогда не слышал о них раньше. Но мне нужно «require» nodejs модули. Модули также должны находиться в том же состоянии, что и в основном потоке. Поэтому я думаю, что веб-работники не являются хорошим решением для этого. – Brettetete

ответ

1

Потому что node.js сам по себе однопоточный, никакой другой код за пределами x() не будет работать до тех пор, пока x() не вернется. Таким образом, вы не можете концептуально делать то, что вы пытаетесь сделать с помощью одной функции, которая работает синхронно.

Есть несколько библиотек, которые добавляют какую-то резьбу (с особыми ограничениями), которую вы могли бы использовать. Вы можете увидеть это сообщение для получения более подробной информации по некоторым из этих вариантов: How to create threads in nodejs

Если вы покажете нам, что делает код внутри x(), мы могли бы предложить вам некоторые идеи о том, как перестроить этот код для достижения вашей цели. Если он имеет асинхронные операции (или может быть преобразован для использования асинхронных операций), то возвращается x(), а другой код может работать, а node.js ожидает, что эти асинхронные операции будут выполнять свою работу, и вы можете сигнализировать о тех асинхронных операциях, которые они должны перестаньте делать свое дело. Но большую часть времени придется ждать асинхронных операций, чтобы эта схема работала.

Если вы можете переместить код x() в отдельный процесс, вы можете запустить дочерний процесс, дать ему код для запуска, а затем убить весь дочерний процесс узла, если он не завершится в определенном количестве время. Это, очевидно, немного тяжелый способ справиться с этим вызовом функции, но это дает вам возможность убить всю среду, если это необходимо. Он также обеспечивает изоляцию процесса, если это полезно с точки зрения безопасности или конфиденциальности.

0

Если вы используете Node.js, вы можете использовать child_process, чтобы выполнять асинхронные вызовы функций, которые вы можете убить позже, если это не закончится за определенный промежуток времени.

Но этот подход нужно отделить function x в другой файл JS, скажем modulex.js, который реализует:

function x(){ 
    // do whatever 
} 
x(); 

Хотя в ваших main.js (или любое имя вы даете ему), где вы хотите, чтобы начать работать function x в том, что modulex.js асинхронно и убить его позже, вы называете это через child_process, который является одним из встроенных в особенности Node.js:

var spawn = require('child_process').spawn; 
var x = spawn('node modulex.js'); // give any particular arguments if required 

x.stdout.on('data', function (data) { 
    // event handler when function x finishes! 

    // data = any output printed by modulex.js 
}); 

x.stderr.on('data', function (data) { 
    // event handler when function x fails! 

    // data = any error printed by modulex.js 
}); 

// Or kill the `x` after a timeout with this: 
function timeout(){ 
    x.kill(); 
} 

Этот подход потребует, чтобы вы немного изменили архитектуру своего узла. Но это позволит справиться с однопоточным JavaScript более эффективно.

Я рекомендую прочитать эту официальную документацию child_process на node.js перед началом работы: https://nodejs.org/api/child_process.html

Смежные вопросы