Из документации цикла событий NodeJS я понял, что обратные вызовы, обрабатываемые циклом событий, являются завершенными задачами.
Верно ли, что поток Libuv обрабатывает асинхронную работу, и когда это будет сделано, цикл событий извлекает работу из очереди событий и просто возвращает обратный вызов?
Поскольку я понимаю, что обратный вызов — это действие, которое нужно выполнить после того, как работа будет выполнена.
Если это предположение верно, когда может блокироваться цикл событий?
Кроме того, не имеет смысла использовать очередь событий и цикл событий только для выполнения обратного вызова после выполнения задания.
Что я не понимаю?
обратные вызовы, обрабатываемые циклом событий, являются завершенными задачами — нет. Когда асинхронная работа завершена, она планирует задачу (выполнение обратного вызова) в цикле событий. — person COLEAN schedule 25.01.2021
цикл событий забирает работу из очереди событий и просто возвращает обратный вызов? — нет. Он извлекает задачи (действия по событию) из очереди событий. И он выполняет обратный вызов, он никуда его не возвращает. — person COLEAN schedule 25.01.2021
не имеет смысла использовать очередь событий и цикл событий только для выполнения обратного вызова после выполнения задания — почему бы и нет? — person COLEAN schedule 25.01.2021
возможный дубликат вчерашнего вопроса — person COLEAN schedule 25.01.2021
Часть асинхронной работы выполняется потоками libuv, часть — нет. Например, в сети используются API-интерфейсы ОС, которые уже работают асинхронно и не используют потоки и не нуждаются в них. В nodejs есть собственная реализация таймера, которая не использует потоки.
Когда асинхронное задание выполнено, оно вставляет событие в очередь событий. Когда наступает очередь этого события извлекать из очереди событий, оно запускает обратный вызов для вызова.
Цикл событий блокируется каждый раз, когда обратный вызов от предыдущего события все еще выполняется. События обрабатываются по одному.
Я не уверен, в чем именно твое замешательство. Когда событие обрабатывается, вызывается обратный вызов, и он начинает выполняться. Если выполняемая работа требует дальнейшей асинхронной работы, то этот обратный вызов запустит одну или несколько дополнительных асинхронных операций, а затем вернется обратно в очередь событий (обратный вызов вернется).
На данный момент работа, которую операция хочет завершить, еще не полностью выполнена (есть несколько новых невыполненных асинхронных операций), но, что касается цикла событий, этот обратный вызов вернулся, и этот обратный вызов выполняется, поэтому цикл событий находит следующее событие готово к запуску.
В какой-то момент в будущем те асинхронные операции, которые только что были запущены, завершатся и вставят событие в цикл событий, когда они будут вызваны, что операция более высокого уровня будет продвигаться дальше к своей конечной цели. Таким образом, серия асинхронных операций, обслуживающих некоторую операцию более высокого уровня, не блокирует цикл событий в течение всего времени, а только во время небольших фрагментов выполнения по пути с возможностью для выполнения других действий, когда выполняется более крупная операция. ожидание завершения асинхронных операций.