Асинхронный и многопоточность. Есть ли разница?

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

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

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

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

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

Ответ 1

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

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

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

Кроме того, вам нужно будет уточнить.

Ответ 2

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

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

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

Ответ 3

Нет, асинхронные вызовы не всегда содержат потоки.

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

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