асинхронный по сравнению с неблокированием

Каково различие между асинхронными и неблокирующимися вызовами? Также между блокированием и синхронными вызовами (с примерами)?

351
задан Sled 10 July 2014 в 02:26
поделиться

5 ответов

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

Например, в API классических сокетов неблокирующий сокет - это тот, который просто немедленно возвращается со специальным сообщением об ошибке «Будет блокировать», тогда как блокирующий сокет будет заблокирован. Вы должны использовать отдельную функцию, например select или poll , чтобы узнать, когда лучше всего повторить попытку.

Но асинхронные сокеты (поддерживаемые сокетами Windows) или шаблон асинхронного ввода-вывода, используемый в .NET, более удобны. Вы вызываете метод, чтобы начать операцию, и фреймворк перезвонит вам, когда это будет сделано. Даже здесь есть принципиальные отличия. Асинхронные сокеты Win32 «маршалируют» свои результаты в конкретный поток графического интерфейса, передавая сообщения Window, тогда как асинхронный ввод-вывод .NET является свободным потоком (вы не знаете, в каком потоке будет вызван ваш обратный вызов).

Значит, они не всегда означают одно и то же. Чтобы выделить пример сокета, мы могли бы сказать:

  • Блокировка и синхронность означают одно и то же: вы вызываете API, он вешает поток, пока не получит какой-то ответ, и вернет его вам.
  • Неблокирование означает, что если ответ не может быть возвращен быстро, API немедленно возвращается с ошибкой и больше ничего не делает. Таким образом, должен быть какой-то связанный способ запросить, готов ли API к вызову (то есть, чтобы имитировать ожидание эффективным способом, чтобы избежать ручного опроса в тесном цикле).
  • Асинхронный означает, что API всегда немедленно возвращается, начав «фоновые» усилия для выполнения вашего запроса, поэтому должен быть какой-то связанный способ для получения результата.
282
ответ дан 23 November 2019 в 00:26
поделиться
  • Асинхронный относится к чему-то, что выполняется параллельно , например, к другому потоку.
  • Неблокирование часто относится к опросу , то есть к проверке выполнения данного условия (сокет доступен для чтения, на устройстве есть больше данных и т. Д.)
46
ответ дан 23 November 2019 в 00:26
поделиться

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

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

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

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

15
ответ дан 23 November 2019 в 00:26
поделиться

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

0
ответ дан 23 November 2019 в 00:26
поделиться

Неблокировка: эта функция не будет ждать в стеке.

Асинхронный: работа может продолжаться от имени вызова функции после того, как этот вызов покинет стек

9
ответ дан 23 November 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: