Узел js: как работает пул потоков libuv? - PullRequest
0 голосов
/ 06 июня 2018

Я изучаю Node Js, я понимаю, что сердце узла js - это схема реактора, которая основана на цикле событий.

Когда происходит какое-либо событие, оно попадает в очередь событий и затем выбираетсястек, когда выполняются задачи, заканчивается, это происходит, если событие неблокирующее, но если это блокирующий запрос, то цикл обработки событий передает его потоку из пула потоков libuv.

Теперь мойСомнения:

  1. Когда выполнение завершено, поток libuv передает запрос обратно в очередь событий или цикл событий?другой учебник имеет другой сценарий.

  2. В пуле потоков в libuv есть еще 3 потока, теперь предположим, что 10 пользователей пытаются войти, и все одновременно (некоторые приложения, такие как Facebook или около того), как только, и потоки блокируются, поскольку они хотят подключиться к БД, так как только три потока будут обрабатывать такую ​​нагрузку?

Я действительно запутался и не получил хорошийобъяснение этих сомнений в любом месте, любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Когда происходит какое-либо событие, оно попадает в очередь событий, а затем попадает в стек.

Событие не попадает в стек.он передается в стек вызовов с помощью цикла событий.

если это запрос на блокировку, то цикл обработки событий передает его потоку из пула потоков libuv.

Есть только ЧЕТЫРЕ вещи, которые используют пул потоков - поиск DNS, fs, crypto и zlib.Все остальное выполняется в главном потоке независимо от того, блокируется он или нет.

Поэтому ведение журнала - это сетевой запрос, и пул потоков не обрабатывает его.Ни libuv, ни узел не имеют никакого кода для обработки этих низкоуровневых операций, связанных с сетевым запросом.Вместо этого libuv делегирует выполнение запроса базовой операционной системе, а затем просто ждет, пока операционная система выдаст сигнал, что какой-то ответ вернулся на запрос.ОС отслеживает соединения в сетевом стеке.Но сетевой ввод / вывод обрабатывается вашим сетевым оборудованием и вашим провайдером.

0 голосов
/ 06 июня 2018

После завершения выполнения поток libuv передает запрос обратно в очередь событий или цикл обработки событий?

С точки зрения node.js это имеет значение?

2) В пуле потоков в libuv есть еще 3 потока, теперь предположим, что 10 пользователей пытаются войти и все одновременно (некоторые приложения, такие как Facebook или около того), как только, и потоки блокируются, поскольку онихотите подключиться к БД, так как только три потока будут обрабатывать такую ​​нагрузку?

libuv использует пул угроз, но не "наивным" способом.Большинство асинхронных запросов - это взаимодействие файловой системы / TCP, которые обрабатываются с помощью select().Вы должны беспокоиться о пуле потоков, только когда вы создаете пользовательский модуль C ++ и вручную отправляете задачу блокировки CPU / IO.

...