В node.js он запускает ваш Javascript в одном потоке (при условии, что мы не говорим о рабочих потоках или кластеризации). Но многие асинхронные операции во встроенной библиотеке node.js, такие как файловый ввод-вывод или некоторые криптографические операции, используют собственные потоки для выполнения своей задачи. Таким образом, когда вы вызываете асинхронные операции, такие как fs.open()
, для открытия файла, он переходит к собственному коду, захватывает поток из внутреннего пула потоков, и этот поток начинает открывать файл. Затем функция fs.open()
возвращается к вашему Javascript (пока поток продолжается в фоновом режиме). Некоторое время спустя, когда он завершает свою задачу, внутренний поток вставляет событие в очередь событий nodejs, и когда у nodejs есть циклы для проверки очереди событий, он находит это событие и запускает обратный вызов Javascript, связанный с ним, чтобы предоставить асинхронный результат обратно в ваш Javascript.
Таким образом, даже несмотря на то, что могут быть задействованы потоки, ваш Javascript по-прежнему является однопоточным в цикле событий.
Таким образом, nodejs использует потоки собственного кода для некоторых внутренних операций с собственным кодом. Другие вещи, такие как работа в сети и таймеры, реализованы без потоков.
Затем, если я отправлю запрос на получение данных из базы данных в Node, как его обработает демультиплексор событий? Останавливает ли основной поток цикл событий для обработки этой операции, а затем возобновляет работу после того, как обработчик событий поставлен в очередь?
Такие термины, как демультиплексор событий, применяются к node.js. Они вообще не используются в node.js, поэтому я не совсем уверен, о чем вы спрашиваете.
Node.js запускает одно событие за раз. У него нет способностей, управляемых прерыванием. Таким образом, он запускает одно событие, пока это событие не вернет управление обратно в цикл событий (путем выдачи return
из обратного вызова, который все запустил). Теперь исходное событие может быть не завершено - оно может выполнять что-то асинхронное, что вызовет другое событие, чтобы объявить о завершении, но на данный момент оно завершило выполнение Javascript и вернуло управление обратно в цикл событий.
Когда входящий запрос Fetch (который является просто входящим http-запросом) поступает на сервер, ОС сначала ставит его в очередь. Затем, когда цикл событий имеет возможность его увидеть, он добавляется в очередь событий node.js и обслуживается в порядке FIFO, когда другие события, которые были до него, обрабатываются. Теперь цикл событий nodejs не так прост, как одна очередь событий. На самом деле у него есть несколько разных очередей для разных типов работы и есть приоритеты для того, что запускается первым, но на самом простом уровне вы можете начать думать об этом как об одной очереди FIFO. И ничего никогда не прерывается.
Извлеките событие из очереди событий, запустите связанный с ним обратный вызов Javascript. Когда этот обратный вызов вернется обратно в цикл событий, получите следующее событие и сделайте то же самое.
События могут быть добавлены в очередь событий либо потоками собственного кода (например, с файловым вводом-выводом или некоторыми криптографическими операциями), либо с помощью некоторых механизмов опроса, встроенных в цикл событий как часть цикла цикла событий, который проверяет определенные вещи. которые готовы к работе (как в случае с сетью и таймерами).
person
jfriend00
schedule
16.09.2020