Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Помимо этого, вам нужно будет уточнить детали.

Другие советы

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

Часто абстракции и 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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top