Выполняя некоторые исследования Node.js и libuv, я начал простой узел с UV_THREADPOOL_SIZE=1
и посмотрел на pstree, чтобы узнать, сколько потоков оно действительно использует.Как node.js и libuv используют разные потоки?
для Node.js 0,10 pstree -p | grep node
производит
node(5157)-+-{node}(5158) `-{node}(5162)
Чтобы сделать вещи немного более сложным, я также попробовал то же самое с 0,12 и iojs 3.3. Количество потоков различается для каждой версии.
Общее число нитей против размера пула потоков
0.10: UV_THREADPOOL_SIZE + 1
0,12: UV_THREADPOOL_SIZE + 2
3,3: UV_THREADPOOL_SIZE + 4
Я также попытался установить более высокие номера для размера пула потоков, чтобы убедиться, что я не ниже минимального значения.
Мои вопросы:
- Что выполняется на главном процессе (5157), а также то, что на приведенных ниже нитей?
- Можно ли считать, что (5158) является идентификатором потока libuv здесь и что (5162) является единственным «рабочим» потоком?
- Что происходит в 0.12 и iojs 3.3? Почему существует не более 4 потоков?
Теперь я также попросил рабочую группу по евангелизации Node.js. Вот полный ответ: https://github.com/nodejs/evangelism/issues/149 TL/DR: дополнительные потоки в более поздних версиях Node.js создаются V8 для GC и динамической перекомпиляции. Мой собственный JavaScript вместе со всеми обратными вызовами запускается в основном потоке - (5157) в моем примере. Каждая функция async запускается в пуле потоков = libuv. – DanielKhan