Асинхронный против многопоточности - есть ли разница?
Всегда ли асинхронный вызов создает новый поток? Какая разница между двумя?
Всегда ли асинхронный вызов создает или использует новый поток?
В компьютерном программировании асинхронные события происходят независимо от основного потока программы. Асинхронные действия - это действия, выполняемые по неблокирующей схеме, что позволяет основному потоку программы продолжить обработку.
Я знаю, что асинхронные вызовы могут быть сделаны на отдельных потоках? Как это возможно?
11 ответов
Этот вопрос чертовски слишком общий, чтобы ответить.
В общем случае асинхронный вызов не обязательно создает новый поток. Это один из способов его реализации, с другими способами уже существующий пул потоков или внешний процесс. Это сильно зависит от языка, объектной модели (если есть) и среды выполнения.
Асинхронный просто означает, что вызывающий поток не сидит и не ждет ответа, а также асинхронная активность не происходит в вызывающем потоке.
Помимо этого, вам нужно будет получить более конкретную информацию.
Всякий раз, когда операция, которая должна выполняться асинхронно, не требует от процессора работы, эта операция может выполняться без порождения другого потока. Например, если асинхронная операция - ввод-вывод, CPU не должен ждать завершения ввода-вывода. Ему просто нужно начать операцию, а затем перейти к другой работе, пока работает оборудование ввода-вывода (контроллер диска, сетевой интерфейс и т. Д.). Аппаратное обеспечение сообщает ЦПУ, когда оно завершается, прерывая ЦП, и ОС затем доставляет событие в ваше приложение.
Часто высокоуровневые абстракции и API не раскрывают базовый асинхронный API, доступный из ОС и базового оборудования. В таких случаях обычно проще создавать потоки для выполнения асинхронных операций, даже если порожденный поток просто ожидает операции ввода-вывода.
Если асинхронная операция требует от процессора работы, то обычно эта операция должна выполняться в другом потоке, чтобы она действительно была асинхронной. Даже в этом случае он будет действительно только асинхронным, если имеется более одного исполнительного блока.
Нет, асинхронные вызовы не всегда связаны с потоками.
Обычно они запускают какую-то операцию, которая продолжается параллельно с вызывающей стороной. Но эта операция может выполняться другим процессом, операционной системой, другим оборудованием (например, контроллером диска), другим компьютером в сети или человеком. Потоки - не единственный способ сделать вещи параллельно.
JavaScript является однопоточным и асинхронным. Например, когда вы используете XmlHttpRequest, вы предоставляете ему функцию обратного вызова, которая будет выполняться асинхронно при возврате ответа.
Джон Резиг хорошо объясняет связанную с этим проблему работы таймеров в JavaScript.
Многопоточность относится к более чем одной операции, происходящей в одном и том же процессе. В то время как асинхронное программирование распространяется на процессы. Например, если мои операции вызывают веб-сервис, поток не должен ждать, пока веб-сервис не вернется. Здесь мы используем асинхронное программирование, которое позволяет потоку не ожидать завершения процесса на другом компьютере. И когда он начинает получать ответ от веб-службы, он может прервать основной поток, чтобы сообщить, что веб-служба завершила обработку запроса. Теперь основной поток может обработать результат.
В Windows всегда была асинхронная обработка, начиная с неперегрузочного времени (версии 2.13, 3.0, 3.1 и т. Д.) С использованием цикла обработки сообщений, прежде чем поддерживать реальные потоки. Таким образом, чтобы ответить на ваш вопрос, нет, нет необходимости создавать поток для выполнения асинхронной обработки.
Асинхронные вызовы даже не должны происходить в той же системе / устройстве, что и вызов. Таким образом, если вопрос заключается в том, требует ли асинхронный вызов потока в текущем процессе, ответ будет отрицательным. Однако где-то должен быть поток выполнения, обрабатывающий асинхронный запрос.
Нить исполнения - неопределенный термин. В кооперативных системах управления задачами, таких как ранние ОС Macintosh и Windows, поток выполнения мог просто быть тем же процессом, который выполнял запрос, выполняющий другой стек, указатель инструкций и т. Д. Однако, когда люди обычно говорят об асинхронных вызовах они обычно означают вызовы, которые обрабатываются другим потоком, если он внутрипроцессный (то есть внутри того же процесса), или другим процессом, если он межпроцессный.
Обратите внимание, что межпроцессное (или межпроцессное) взаимодействие (IPC) обычно обобщается и включает внутрипроцессное взаимодействие, поскольку методы блокировки и синхронизации данных обычно одинаковы независимо от того, в каком процессе выполняются отдельные потоки выполнения.
Некоторые системы позволяют вам использовать преимущества параллелизма в ядре для некоторых средств, использующих обратные вызовы. Для довольно непонятного случая асинхронные обратные вызовы ввода-вывода использовались для реализации неблокирующих интернет-серверов еще в дни без вытеснения многозадачности Mac System 6-8.
Таким образом, у вас есть параллельные потоки выполнения "в" вашей программе без потоков как таковых.
Асинхронный означает, что вы не блокируете свою программу в ожидании завершения чего-либо (вызова функции, устройства и т. Д.). Он может быть реализован в отдельном потоке, но также распространено использование выделенного потока для синхронных задач и связи через какую-либо систему событий и, таким образом, достижение асинхронного поведения.
Есть примеры однопоточных асинхронных программ. Что-то вроде:
...do something
...send some async request
while (not done)
...do something else
...do async check for results
Природа асинхронных вызовов такова, что, если вы хотите, чтобы приложение продолжало работать во время вызова, вам нужно будет либо создать новый поток, либо, по крайней мере, использовать другой поток, который вы создали, исключительно для целей обработка асинхронных обратных вызовов.
Иногда, в зависимости от ситуации, вы можете вызывать асинхронный метод, но показывать пользователю, что он является синхронным (т.е. блокировать до тех пор, пока асинхронный метод не сообщит, что он завершен). Это может быть достигнуто с помощью Win32 API, таких как WaitForSingleObject.
Асинхронная операция - это операция, которая после инициации продолжается в фоновом режиме, не вынуждая вызывающую программу дождаться ее завершения, прежде чем запускать другой код.
Вместо того, чтобы блокировать вызывающую программу (или поток) до получения ответа, асинхронная (также называемая неблокирующая) реализация отправит запрос в базу данных или веб-службу или что-либо еще, а затем немедленно вернется, позволяя вашей программе продолжить выполнение другого кода пока удаленная служба отправляет ответ. Как только ответ поступит, система запустит обратный вызов (либо в вашем цикле сообщений, либо в отдельном потоке порта завершения ввода-вывода, в зависимости от среды), что позволит вашему коду обработать ответ.
Многопоточность означает запуск более чем одного потока выполнения одновременно. В этой модели все операции по-прежнему являются синхронными, но ЦП будет выполнять несколько потоков синхронных операций одновременно.
Многопоточность наиболее целесообразна при вызове нескольких (и независимых) операций, связанных с процессором, на многоядерном процессоре. Например, программа, которая независимо анализирует каждый пиксель в изображении, может разделить изображение на одну полосу для каждого ядра ЦП, а затем одновременно проанализировать каждую полосу в своем собственном потоке.
Подробнее читайте здесь - https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/