Под асинхронностью в компьютерном программировании понимается возникновение событий, не зависящих от основного потока программы и способов обработки таких событий. Это могут быть «внешние» события, такие как поступление сигналов или действия, инициированные программой, которые происходят одновременно с выполнением программы, без блокировки программы для ожидания результатов. [1] Асинхронный ввод / вывод является примером последней причины асинхронности и позволяет программам отдавать команды запоминающим устройствам или сетевым устройствам, которые обслуживают эти запросы, в то время как процессор продолжает выполнение программы. Это обеспечивает определенную степень параллелизма .[1]
Распространенный способ решения проблемы асинхронности в интерфейсе программирования - предоставление подпрограмм (методов, функций), которые возвращают вызывающей стороне объект, иногда называемый будущим или обещанием , который представляет текущие события. Такой объект обычно сопровождается операцией синхронизации, которая блокируется, пока операция не будет завершена. Некоторые языки программирования, такие как Cilk , имеют специальный синтаксис для выражения вызова асинхронной процедуры. [2]
Примеры асинхронности включают следующее:
- Асинхронный вызов процедуры , метод для одновременного запуска процедуры, легкая альтернатива Threads .
- « Ajax », сокращение от «асинхронный JavaScript и XML ») [3] [4] [5] - это набор методов веб-разработки , использующих множество веб-технологий, используемых на стороне клиента для создания веб-приложений с асинхронным вводом-выводом .
- Диспетчер асинхронных методов (AMD), метод передачи данных, используемый, когда серверная сторона должна обрабатывать большое количество длительных клиентских запросов. [6] Используя синхронный метод диспетчеризации (SMD), этот сценарий может перевести сервер в недоступное состояние занятости, что приведет к отказу соединения, вызванному тайм-аутом запроса сетевого соединения . Обслуживание клиентского запроса немедленно отправляется доступному потоку из пула потоков, и клиент переводится в состояние блокировки. По завершении задачи сервер уведомляется обратным вызовом. Сервер разблокирует клиента и передает ответ клиенту. В случае нехватки потоков клиенты блокируются в ожидании доступности потоков.
Сценарии для async
- Операции ввода-вывода . Примеры: выполнение сетевого вызова, обращение к базе данных, чтение файла, печать документа и т. Д. Синхронная программа, выполняющая операцию ввода-вывода, останавливается до завершения операции. Более эффективная программа вместо этого выполнит операцию и продолжит выполнение другого кода, пока операция не завершена. Допустим, у вас есть программа, которая считывает данные, введенные пользователем, выполняет вычисления и затем отправляет результат по электронной почте. При отправке электронного письма вы должны отправить некоторые данные в сеть, а затем дождаться ответа принимающего сервера . Время, затрачиваемое на ожидание ответа сервера, - это потеря времени, которое было бы гораздо лучше использовать, если бы программа продолжала вычислять.
- Параллельное выполнение нескольких операций : когда вам нужно выполнять разные операции параллельно, например, делать вызов базы данных, вызов веб-службы и любые вычисления, тогда мы можем использовать асинхронность.
- Долгосрочные запросы, управляемые событиями: это идея, когда у вас есть запрос, который приходит, и этот запрос на некоторое время засыпает, ожидая, когда произойдет какое-то другое событие. Когда это событие произойдет, вы хотите, чтобы запрос продолжился, а затем отправил ответ клиенту. Итак, в этом случае, когда поступает запрос, этому запросу назначается поток, и когда запрос переходит в спящий режим, поток отправляется обратно в пул потоков, и по завершении задачи он генерирует событие и выбирает поток из пула потоков для отправка ответа (поток, отправленный и выбранный из пула потоков, может быть, а может и не совпадать. [7]
Смотрите также
Рекомендации
- ^ a b Дэвис, Алекс (2012). Асинхронный режим в C # 5.0 . О'Рейли. С. 1–2.
- ^ МакКул, Майкл; Рейндерс, Джеймс; Робисон, Арка (2013). Структурированное параллельное программирование: шаблоны для эффективных вычислений . Эльзевир. п. 30.
- ^ Крис Шифлетт. «Аякс - это не аббревиатура» .
- ^ «AJAX vs Ajax - Ajax ofcourse! (Арун Гупта, Майлз остается ...)» .
- ^ Джесси Джеймс Гарретт (18 февраля 2005 г.). «Ajax: новый подход к веб-приложениям» . AdaptivePath.com . Проверено 19 июня 2008 года .
- ^ Использование ICE AMD .
- ^ Гоэль, Гаурав. «Учебное пособие по асинхронности и ожиданию» . Код проекта . Проверено 3 марта 2020 года .