2015-09-07 6 views
0

Выполняя некоторые исследования 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

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

Мои вопросы:

  1. Что выполняется на главном процессе (5157), а также то, что на приведенных ниже нитей?
  2. Можно ли считать, что (5158) является идентификатором потока libuv здесь и что (5162) является единственным «рабочим» потоком?
  3. Что происходит в 0.12 и iojs 3.3? Почему существует не более 4 потоков?

ответ

2

Я не могу говорить о части Node/V8, но в общем случае приложение libuv будет использовать потоки по крайней мере 1 + UV_THREADPOOL_SIZE.

Первый поток - это тот, который запускает цикл libuv, вызывая uv_run, который обычно является основным потоком. libuv имеет пул потоков из UV_THREADPOLL_SIZE, где выполняются операции с файловой системой и DNS. Сетевой ввод-вывод выполняется в потоке контура, используя epoll/kqueue и т. Д.

+0

Теперь я также попросил рабочую группу по евангелизации Node.js. Вот полный ответ: https://github.com/nodejs/evangelism/issues/149 TL/DR: дополнительные потоки в более поздних версиях Node.js создаются V8 для GC и динамической перекомпиляции. Мой собственный JavaScript вместе со всеми обратными вызовами запускается в основном потоке - (5157) в моем примере. Каждая функция async запускается в пуле потоков = libuv. – DanielKhan