Почему сон в nodejs не работает, как ожидалось

Я использую эту библиотеку, чтобы спать внутри цикла, мой цикл выглядит так

while(condition){
    usleep(1)
    while(condition){
        usleep(1)
        // ... do stuff (sync)
    }
}

Несмотря на то, что я сплю только 1us, цикл никогда не прерывается, просто очень-очень долго, но когда я удаляю оператор сна, он просто запускается и выполняется.

Я пытаюсь спать, чтобы процессор успокоился и не использовал 100%, поэтому сервер продолжает принимать другие запросы!

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

Я думал, используя рекурсию, но я боюсь, что это будет слишком медленно, я повторяю около 100000

2 ответа

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

Если вам действительно нужно сохранить этот код таким, какой он есть сейчас, используйте Promises и async / await. Таким образом, ваше приложение не будет заблокировано для других запросов.

Что-то вроде этого для начала:

async function sleep(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms);
    });
}

async function run() {
    while(condition){
        await sleep(1000);
        // ... do stuff
    }
}

run().catch(err => console.error(err));
Другие вопросы по тегам