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



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



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



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




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




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

1517   11  

11 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

обратите внимание, что межпроцессная (или межпроцессная) связь (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/

Comments

    Ничего не найдено.