2017-01-19 10 views
0

У меня есть эта функция, и она вызывается во время запуска моего узла-сервера в файле index.js. В функции init он устанавливает setInterval, чтобы периодически звонить refreshKeyValues, что занимает около 10 секунд. Я проверил некоторые тесты и отправил проверку работоспособности (простой вызов на конечную точку здоровья, возвращающий 200 ok), и казалось, что проверка работоспособности заблокирована при запуске refreshKeyValues. setInterval блокировка? Как сделать эту обновляющую логику запущенной на фоне, чтобы она не блокировала входящие запросы?Как сделать setInterval работает на фоне?

export default function initMyClient(server) { 
    server.clients.myclient = MyClient.createNewClient(); 
    server.clients.myclient.init(); 
    server.keyValues = getKeyValues(); 
    function refreshKeyValues() { 
    server.keyValues = getKeyValues(); 
    } 
    const refreshInterval = setInterval(
    refreshKeyValues, 
    1000 
); 
    server.on('close', function onClose() { 
    clearInterval(refreshInterval); 
    }); 
} 
+0

Как реализован 'getKeyValues ​​()'? Редко можно найти задачу с интенсивным процессором, которая занимает очень много времени. Кроме того, ваш период в коде выше 1 секунда, а не 10. – slebetman

ответ

0

setInterval Функция в JavaScript является асинхронным, поэтому он не блокирует основной поток, когда его «ожидания» состоянии. Но ваша функция refreshKeyValues кажется не асинхронной, поэтому она может блокировать основной поток JavaScript. Когда он вызывается, refreshKeyValues может блокировать поток, поскольку JavaScript является однопоточным. Вы можете лучше понять, читая это: JavaScript event loop

0

Ivan Matveev полностью верен. Node.js является однопоточным, хотя может показаться, что это связано не с его асинхронным характером. Однако вы можете добиться того, что вам нужно с модулем cluster. Вот как это сделать:

var cluster = require('cluster'); 


if (cluster.isMaster) { 
    var httpWorker = cluster.fork(); // worker thread for server 
    var intervalWorker = cluster.fork(); // worker thread for setInterval 
    // send messages to your wokers specifying the worker type 
    httpWorker.send({ server: true }); 
    intervalWorker.send({ server: false }); 
} else { 
    process.on('message', function (data) { 
    if (data.server) { 
     // start server 
     var server = require('http').createServer(function (req, res) { 
     res.end('OK'); 
     }); 
     server.listen(8080, function() { 
     console.log('server running'); 
     }); 
    } else { 
     // start your interval 
     setInterval(function() { 
      console.log('1s passed'); 
     }, 1000); 
    } 
    }); 
} 

EDIT:

Кроме того, почему вы используете ваш refreshKeyValues функцию один раз в секунду, если он принимает 10s для запуска? Я бы рекомендовал вам называть его каждые 10 секунд ...

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

  • Нет связанных вопросов^_^