Node.JS: setTimeout, который не поддерживает процесс - PullRequest
8 голосов
/ 08 мая 2011

Я бы хотел добавить в этот процесс тайм-аут на один час, чтобы он не оставался вечным в случае тупиковой ситуации потока.Единственная проблема заключается в том, что если я скажу setTimeout, у процесса не будет возможности завершиться досрочно.

Есть ли способ ввести тайм-аут принудительного выхода примерно через час, не запуская процесс?Или я застрял между использованием process.exit и обходом без этого таймаута?

Ответы [ 3 ]

15 голосов
/ 28 декабря 2013

Я не знаю, когда unref был добавлен в узел, но сейчас это одно из возможных решений.Повторное использование кода Мэтта:

var timeoutId = setTimeout(callback, 3600000);
timeoutId.unref(); // Now, Node won't wait for this timeout to complete if it needs to exit earlier.

Документ говорит:

В случае setTimeout, когда вы отменяете, вы создаете отдельный таймер, который будет вызывать цикл обработки событий, создавая слишком многоони могут отрицательно повлиять на производительность цикла обработки событий - используйте их с умом.

Не бредите этим.

6 голосов
/ 08 мая 2011

Если вы сохраните значение, возвращаемое setTimeout, вы всегда можете отменить его, прежде чем оно сработает с clearTimeout, например:

var timeoutId = setTimeout(callback, 3600000); // 1 hour

// later, before an hour has passed
clearTimeout(timeoutId);
1 голос
/ 30 декабря 2011

Возможное решение с использованием новой функции , чтобы было реализовано как process.watchers(), но я пока не знаю, было ли оно включено в выпущенную версию , запрос на получение по-прежнему открыт на данный пост.

Но, вообще говоря, вы бы написали пользовательскую функцию setTimeout, которая добавляет все таймауты к счетчику, а непосредственно перед тайм-аутами к обратному вызову она удалялась бы из счетчика.

Затем создайте текущий интервал, и этот интервал будет проверять и замечать, когда у всех ходящих есть просто тайм-ауты, установленные вашей пользовательской функцией.

Когда он замечает это, он (удаляет все эти таймауты, вызывая) завершается.

Это, конечно, не здорово, потому что

  • Концепция не доказана. (Я не знаю, какие данные будут возвращены process.watchers(), или даже если они еще будут работать)
  • Интервал - это метод опроса. (не хорошо, если вы хотите немедленный возврат в то же время, что и загрузка ЦП)
...