Как работает асинхронное программирование в однопоточной модели программирования? - PullRequest
62 голосов
/ 24 января 2012

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

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

Ответы [ 2 ]

80 голосов
/ 24 января 2012

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

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

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

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

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

Редактирование выполнено

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

11 голосов
/ 24 января 2012

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

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

...