Асинхронное программирование означает многопоточность? - PullRequest
35 голосов
/ 22 января 2012

Давайте поговорим о коде JavaScript, который имеет setInterval методы каждые 2 сек.

У меня также есть onblur событие анимации для некоторого элемента управления.

В случае, когда происходит onblur (+ анимация), я мог бы получить функцию setInterval.

Итак, мой вопрос:
Асинхронное программирование означает многопоточность? (никак?)

Я знаю, что Javascript не является многопоточным языком.

Итак ...

Ответы [ 4 ]

73 голосов
/ 22 января 2012

Нет. Это означает буквально, что это означает - асинхронный. Понимание разницы между асинхронным программированием и программированием на основе потоков имеет решающее значение для вашего успеха в качестве программиста.

В традиционной не поточной среде, когда функция должна ожидать внешнего события (такого как сетевое событие, событие клавиатуры или мыши или даже событие часов), программа должна wait пока не произойдет это событие.

В многопоточной среде многие отдельные потоки программирования выполняются одновременно. (В зависимости от количества процессоров и поддержки операционной системы, это может быть буквально верно, или это может быть иллюзия, созданная сложными алгоритмами планирования). По этой причине многопоточные среды являются сложными и включают в себя проблемы потоков, блокирующих память друг друга для предотвращения их переполнения.

В асинхронной среде один поток процесса работает все время, но он может по причинам, обусловленным событиями (и это ключ), переключаться с одной функции на другую. Когда происходит событие, и когда текущий запущенный процесс достигает точки, в которой он должен ждать другого события , ядро ​​javascript затем сканирует свой список событий и доставляет следующее, в (формально) неопределенном (но, вероятно, детерминированный) порядок, к менеджеру событий.

По этой причине управляемое событиями асинхронное программирование позволяет избежать многих ловушек традиционного многопоточного программирования, таких как проблемы нехватки памяти. Все еще могут быть условия гонки, поскольку порядок обработки событий зависит не от вас, но они редки и ими легче управлять. С другой стороны, поскольку обработчик событий не доставляет события до тех пор, пока текущая функция не достигнет бездействия, некоторые функции могут лишить остальной части программирования. Это происходит в Node.js, например, когда люди по глупости делают много тяжелой математики на сервере - это лучше всего запихнуть на маленький сервер, который затем «ждет» доставки ответа. Node.js - отличный маленький коммутатор для событий, но все, что занимает более 100 миллисекунд, должно обрабатываться клиент-серверным способом.

В среде браузера события DOM обрабатываются как автоматические точки событий (они должны быть, изменение DOM доставляет много событий), но даже там плохо написанный Javascript может истощить ядро, поэтому и Firefox, и В Chrome есть эти обработчики прерываний "Этот скрипт перестал отвечать".

6 голосов
/ 22 января 2012

Однопоточный цикл обработки событий является хорошим примером асинхронности в однопоточном языке.

Концепция заключается в том, что вы присоединяете обработчики обратного вызова doLater к eventLoop.Тогда eventLoop - это просто while(true), который проверяет, соблюдается ли конкретная временная метка для каждого обработчика doLater, и, если это так, вызывает обработчик.

Для заинтересованных лиц здесь наивно (иужасно неэффективная игрушка) реализация однопоточного цикла событий в JavaScript

Это означает, что без какого-либо доступа к вашему потоковому планировщику потоков в ОС вы вынуждены ждать doLater обратные вызовы.

Если у вас есть вызов sleep, вы можете просто сделать sleep до следующего обработчика doLater, который более эффективен, чем занятое ожидание, так как вы планируете свой единственный поток и позволяете ОСделать другие вещи.

0 голосов
/ 22 января 2012

Если есть обратный вызов, что-то должно вызвать его.Единицами выполнения являются потоки, поэтому да, другой поток должен вызвать обратный вызов, либо напрямую, либо поставив в очередь какой-то асинхронный вызов процедуры в инициирующий поток.

0 голосов
/ 22 января 2012

Только в том смысле, что он выполняет код случайно и рискует состязанием. Вы не получите никаких преимуществ в производительности благодаря использованию тайм-аутов и интервалов.

Тем не менее, веб-работники HTML5 допускают реальную многопоточность в браузере: http://www.html5rocks.com/en/tutorials/workers/basics/

...