Подтвердить что ты не робот

Как работает асинхронное программирование в однопроцессорной модели программирования?

Я просматривал детали node.js и узнал, что он поддерживает асинхронное программирование, хотя по сути он предоставляет одну поточную модель.

Как обрабатывается асинхронное программирование в таких случаях? Это похоже на то, что сама среда выполнения создает и управляет потоками, но программист не может создавать потоки явно? Было бы здорово, если бы кто-то мог указать мне на некоторые ресурсы, чтобы узнать об этом.

4b9b3361

Ответ 1

Скажите мне сейчас: асинхронное программирование не обязательно означает многопоточность.

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

Фрэнк говорит это правильно (хотя и тупо). На английском языке: существует основной цикл событий, который обрабатывает, когда что-то приходит в ваше приложение. Таким образом, "обработать этот HTTP-запрос" будет добавлен в очередь событий, а затем обработан контуром события, когда это необходимо.

Когда вы вызываете операцию async (например, запрос mysql db), node.js отправляет "эй, выполнит этот запрос" в mysql. Поскольку этот запрос займет некоторое время (миллисекунды), node.js выполняет запрос с использованием библиотеки async MySQL - возвращается к циклу событий и делает что-то еще там, ожидая, когда mysql вернется к нам. Подобно обработке этого HTTP-запроса.

Изменить. Напротив, node.js может просто подождать (ничего не делать) для mysql, чтобы вернуться к нему. Это называется синхронным вызовом. Представьте себе ресторан, где ваш официант подает ваш заказ повару, затем садится и сжимает большие пальцы, пока шеф-повар готовит. В ресторане, как в программе node.js, такое поведение глупо - у вас есть другие клиенты, которые голодны и нуждаются в обслуживании. Таким образом, вы хотите быть как можно более асинхронным, чтобы убедиться, что один официант (или node.js-процесс) обслуживает как можно больше людей.

Отредактировано сделано

Node.js связывается с mysql, используя библиотеки C, поэтому технически эти библиотеки C могут возникать из потоков, но внутри Javascript вы ничего не можете делать с потоками.

Ответ 2

Райан сказал, что лучше всего: sync/async ортогонален одиночному/многопоточному. Для однопоточных и многопоточных случаев существует основной цикл событий, который вызывает зарегистрированные обратные вызовы с помощью Reactor Pattern. Для однопоточного случая обратные вызовы последовательно вызывается в основном потоке. Для многопоточного случая они вызываются в отдельных потоках (обычно с использованием пула потоков). На самом деле вопрос о том, сколько будет конкуренции: если для всех запросов требуется синхронизованный доступ к единой структуре данных (скажем, список подписчиков), выгоды от наличия нескольких потоков могут быть уменьшены. Это зависит от проблемы.

Что касается реализации, если структура является однопоточной, то она, вероятно, использует poll/select системный вызов, то есть ОС запускает асинхронный событие.