Как я знаю, что я достиг предела потоков, определенного в 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)