Как я знаю, что я достиг предела потоков, определенного в Node?
Я ограничил размер пула потоков до 25.
process.env.UV_THREADPOOL_SIZE = 25;
Как можно знать, что все потоки исчерпаны во время выполнения?
Есть ли способ обнаружить, что все определенные потоки исчерпаны во время нового запроса?
Я использую Native Abstractions для Node.js(NAN) для вызова функций C++. Для каждого запроса к C++ создается Nan :: AsyncQueueWorker. Здесь я хочу узнать, исчерпан ли предел потока, а затем добавить фактор безопасности.
Ответы
Ответ 1
Вы ищете реализацию в Nan или JS?
В Нан импл:
Вы должны сделать это вручную. Поддерживайте карту, где ключ - это int, а значение - как workAsyn. Нажмите на каждый вызов и удалите, когда работа завершена. Делайте это для каждого запроса.
Сравните размер карты с определенным лимитом потока.
Ответ 2
Я проанализировал нана и libuv источники. К сожалению, сейчас нет способа узнать количество используемых потоков. Если только добавить эту функцию самостоятельно.
Ответ 3
Код JavaScript process.env.UV_THREADPOOL_SIZE = 25;
в Windows не работает, нужно set UV_THREADPOOL_SIZE=1
перед запуском скрипта.
set UV_THREADPOOL_SIZE=1 & node app.js
В Linux Inside JavaScript-код работает нормально.
Вы можете создать скрипт NPM:
SET UV_THREADPOOL_SIZE=1 && node app.js
Для дополнительной информации
https://github.com/nodejs/help/issues/1429
Ответ 4
Похоже, этот cluster
модуль может помочь...
var cluster = require('../')
,http = require('http');
var server = http.createServer(function(req, res){
res.writeHead(200);
res.end('Hello World');
});
var workerCount = 0;
cluster(server)
.listen(3000)
.on('worker',()=> {
workerCount++;
console.log('workerCount',workerCount)
})
.on('worker killed',()=> {
workerCount--;
console.log('workerCount',workerCount)
})
Также, похоже, можно получить доступ к количеству рабочих непосредственно из master
с помощью плагина REPL "telnet"...
http://learnboost.github.io/cluster/docs/stats.html
Документы
Ответ 5
Для проверки потоки исчерпаны во время выполнения этим кодом
function runAsync(numTasks) {
var taskIds = Array(numTasks).fill(0).map((_, i) => 'asyncTask_' + i);
var promises = taskIds.map(
taskId => doAsyncStuffPromised(taskId)
.then((tId) => {
console.log('task %s finished', tId);
return tId;
})
);
console.time(logMsg);
return Promise.all(promises)
.then(taskIds => {
console.log('all tasks finished:', taskIds);
console.timeEnd(logMsg);
})
.catch(error => console.log(error))
}
runAsync(50)