Асинхронный против многопоточности - есть ли разница? - PullRequest
126 голосов
/ 02 марта 2009

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

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

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

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

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

Ответы [ 11 ]

92 голосов
/ 02 марта 2009

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

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

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

77 голосов
/ 02 марта 2009

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

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

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

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

16 голосов
/ 19 ноября 2009

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

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

12 голосов
/ 20 апреля 2012

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

11 голосов
/ 10 марта 2009

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

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

10 голосов
/ 02 марта 2009

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

8 голосов
/ 02 марта 2009

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

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

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

6 голосов
/ 02 марта 2009

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

Таким образом, у вас есть параллельные потоки выполнения «в» вашей программе без потоков как таковые .

4 голосов
/ 02 марта 2009

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

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

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results
2 голосов
/ 02 марта 2009

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

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

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