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


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

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

2 57

2 ответа:

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

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

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

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

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

Edit done

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

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

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