Это интересный вопрос.
Асинхронное программирование - это парадигма программирования, которая в основном однопоточная, т. Е. «После одного потока непрерывного выполнения».
Вы ссылаетесь на javascript, поэтому давайте обсудим этот язык в среде веб-браузера. Веб-браузер запускает один поток выполнения javascript в каждом окне, обрабатывает события (например, onclick = "someFunction()") и сетевые соединения (например, вызовы xmlhttprequest).
<script>
function performRequest() {
xmlhttp.open("GET", "someurl", true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
alert(xmlhttp.responseText);
}
}
xmlhttp.send(sometext);
}
</script>
<span onclick="performRequest()">perform request</span>
(Это нерабочий пример, только для демонстрации понятий).
Чтобы сделать все в асинхронном режиме, управляющая нить имеет так называемый «основной цикл». Основная петля выглядит примерно так:
while (true) {
event = nextEvent(all_event_sources);
handler = findEventHandler(event);
handler(event);
}
Важно отметить, что это не «цикл занятости». Это похоже на спящую нить, ожидающую активности. Активность может быть введена пользователем (Движение мыши, нажатие кнопки, Ввод), или это может быть сетевая активность (ответ от сервера).
Таким образом, в приведенном выше примере,
- Когда пользователь нажимает на пролете, A ButtonClicked событие будет генерироваться, findEventHandler() найдет событие OnClick на тег диапазона, а затем этот обработчик будет вызывается с событием.
- Когда запрос xmlhttp создается, он добавляется в список источников событий all_event_sources.
- После того, как функция executeRequest() вернется, mainloop ждет следующего шага nextEvent(), ожидая ответа. На данный момент нет никаких «блокировок» дальнейших событий от обработки.
- Данные возвращаются с удаленного сервера, nextEvent() возвращает сетевое событие, обработчик события является методом onreadystatechange(), этот метод вызывается и запускается диалог alert().
Следует отметить, что alert() является диалогом блокировки. Пока этот диалог завершен, дальнейшие события не могут быть обработаны. Это эксцентричность javascript-модели веб-страниц, в которой у нас есть доступный метод, который блокирует дальнейшее выполнение в контексте этой страницы.
предложите отредактировать ответ «Стоит ничего» отличается от «Стоит noTing» , который, я думаю, является вашим намерением. Чтобы избежать путаницы для читателей – MadMurf
@MadMurf: Я тоже это заметил ... и исправил. – mpen
>> Асинхронное программирование - это парадигма программирования, которая в основном однопоточная << - Не пытайтесь быть педантичной здесь, но я не вижу, как это утверждение верно. Асинхронное программирование подразумевает что-либо о потоках, не говоря уже о одиночном и множественном? – Lee