#node.js #events
#node.js #Мероприятия
Вопрос:
Я хочу запланировать выполнение заданий каждые x секунд, так как это можно сделать. Примером может служить пинг сервера каждые 10 секунд, но все это должно быть асинхронным, чтобы ни одна из других функций не останавливалась.
Ответ №1:
Это зависит от того, что вы подразумеваете под «ни одна из других функций не останавливается». Пинг сервера уже является неблокирующим и асинхронным, поскольку вся сеть в nodejs именно такова.
Итак, код, подобный этому:
setInterval(() => {
// put code to do the ping here
}, 5000);
Не будет блокировать остальную часть вашего сервера, потому что код, выполняемый для ping, уже неблокирующий.
Однако остальная часть вашего сервера может заблокировать setInterval()
запуск вовремя. Если вы выполняли какой-то длительный блокирующий код на своем сервере, setInterval()
обратный вызов таймера не выполнялся бы до тех пор, пока этот код не был выполнен, и он может быть отложен с момента, когда он был запланирован для запуска. Поскольку nodejs является однопоточным и управляемым событиями, он не может обработать следующее событие таймера, пока предыдущее событие (каким бы оно ни было) не будет выполнено, выполняя блокирующую часть его кода.
Если вы хотите быть абсолютно уверены, что ваш таймер всегда будет выполняться очень близко к тому времени, когда он должен выполняться, вам либо нужно убедиться, что остальная часть вашей программы никогда не блокируется очень долго, либо вам нужно будет переместить таймер в другой поток или процесс Javascript и связаться с основным потоком черезобмен сообщениями.
Вы можете использовать WorkerThread в рамках существующего процесса nodejs или вы можете использовать модуль child_process для запуска отдельной дочерней программы, которая выполняет пинг за вас. Nodejs имеет встроенные сообщения, которые будут работать либо из WorkerThread, либо из child_process обратно в вашу основную программу или из нее.
Ответ №2:
Вам нужно будет использовать многопоточность, чтобы создать неблокирующий код. Я бы предложил использовать встроенный node.js многопоточный пакет с именем worker_threads. https://nodejs.org/api/worker_threads.html