Асинхронная vs многопоточность-есть ли разница?

асинхронный вызов всегда создает новый поток? В чем разница между ними?

асинхронный вызов всегда создает или использует новый поток?

Википедия говорит:

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

Я знаю, что асинхронные вызовы могут выполняться в отдельных потоках? Как это возможно?

11 ответов


этот вопрос слишком общий, чтобы ответить.

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

асинхронный просто означает, что вызывающий поток не сидит и не ждет ответа, и асинхронная активность не происходит в вызывающий поток.

помимо этого, вам нужно будет получить более конкретную информацию.


всякий раз, когда операция, которая должна произойти асинхронно, не требует, чтобы процессор выполнял работу, эта операция может быть выполнена без создания другого потока. Например, если асинхронной операцией является ввод-вывод, процессору не нужно ждать завершения ввода-вывода. Он просто должен начать работу, а затем может перейти к другой работе в то время как оборудование ввода-вывода (контроллер диска, сетевой интерфейс и т. д.) ли я/О работы. Аппаратное обеспечение позволяет CPU знать, когда оно завершено, прерывая CPU, а затем ОС доставляет событие в ваше приложение.

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

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


нет, асинхронные вызовы не всегда включают потоки.

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


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


JavaScript является однопоточным и асинхронные. Например, при использовании XmlHttpRequest вы предоставляете ему функцию обратного вызова, которая будет выполняться асинхронно при возврате ответа.

Джон Resig имеет хорошее объяснение связанного с этим вопроса о том, как таймеры работают в JavaScript.


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


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

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

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


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

таким образом, у вас есть параллельные потоки выполнения "в" вы программируете без потоков что такое.


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

есть примеры однопоточных асинхронных программ. Что-то вроде:

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results

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

иногда, в зависимости от ситуации, вы можете вызвать асинхронный метод, но заставить его казаться пользователю синхронным (т. е. блокировать пока асинхронный метод не подаст сигнал о завершении). Это может быть достигнуто с помощью Win32 API, таких как WaitForSingleObject.


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

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

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

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

подробнее здесь https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/