асинхронные и неблокирующие вызовы? также между блокировкой и синхронным

В чем разница между асинхронными и неблокирующими вызовами? Также между блокировкой и синхронным вызовом (пожалуйста, с примерами)?


person user331561    schedule 12.04.2010    source источник
comment
По теме: stackoverflow.com/a/9489547/194894   -  person Flow    schedule 22.09.2013
comment
Я хорошо понял различия, читая книгу ‹Сетевое программирование Unix› Столбец 1, Глава 6.   -  person Bin    schedule 18.10.2016
comment
Интересная статья: Повышение производительности приложений с помощью асинхронного ввода-вывода. Он делит парадигмы ввода-вывода на 4 категории: (1) блокирующий + синхронный, (2) неблокирующий + синхронный, (3) блокирующий + асинхронный и (4) неблокирующий + асинхронный.   -  person M.S. Dousti    schedule 29.04.2017
comment
@ M.S.Dousti Эксперт Google сказал мне, что это в некотором роде неправильно.   -  person Rick    schedule 14.11.2018
comment
@ M.S.Dousti После некоторого изучения я думаю, что нет сочетания (3) и (2), как вы описываете в комментариях. Проверьте определение Asynchronous, оно говорит о том же, что и Non-Blocking. Как видите, верхний ответ подтверждает мое мнение. Функция опроса и обратного вызова - это просто способы / шаблоны для реализации асинхронного режима. Да, я говорю, что блокирующий, синхронный и неблокирующий, асинхронный - это две пары синонимов.   -  person Rick    schedule 16.11.2018


Ответы (14)


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

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

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

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

  • Блокировка и синхронность означают одно и то же: вы вызываете API, он вешает поток, пока не получит какой-то ответ, и вернет его вам.
  • Неблокирование означает, что если ответ не может быть возвращен быстро, API немедленно возвращается с ошибкой и больше ничего не делает. Таким образом, должен быть какой-то связанный способ запросить, готов ли API к вызову (то есть, чтобы имитировать ожидание эффективным способом, чтобы избежать ручного опроса в тесном цикле).
  • Асинхронный означает, что API всегда немедленно возвращается, начав «фоновые» усилия для выполнения вашего запроса, поэтому должен быть какой-то связанный способ получения результата.
person Daniel Earwicker    schedule 12.04.2010
comment
IO в состоянии готовности, а не в состоянии завершения IO; в Linux см. libaio - person Will; 13.04.2010
comment
Благодарим за указание на то, что эти термины зависят от контекста и иногда могут использоваться непоследовательно. Я нахожу в особенности в технологии, но и в других областях, что часто более полезно признать этот факт, чем вступать в споры о том, какое точное определение является правильным, как иногда бывает. - person Chad N B; 27.11.2012
comment
Продолжение Q: Кажется, ответ заключается в двух разных различиях между терминами. Во-первых, уведомление: неблокирование подразумевает, что приложение должно снова проверить позже (опрос), тогда как async подразумевает, что мы можем забыть об этом и полагаться на фреймворк / ОС, чтобы уведомить нас через обратный вызов или публикацию события. Во-вторых, действие: неблокирование абсолютно ничего не делает, кроме как возвращает ошибку, тогда как async ставит действие в очередь или в некотором смысле выполняет его в фоновом режиме. Какая разница важнее для различения терминов? Связано ли какое-либо различие с одним термином сильнее? Или это неоднозначно? - person Chad N B; 27.11.2012
comment
@ChadNB - как термины, неблокирование тесно связано с опросом. Что касается вопроса о том, запоминает ли API вашу попытку вызвать его: единственная причина, по которой API запоминает, - это перезвонить вам. Если вы собираетесь вызывать его для повторного опроса, тогда вам уже нужно поддерживать необходимое состояние, чтобы знать, чтобы сделать этот последующий вызов, поэтому API не будет добавлять ценности, также поддерживая состояние. - person Daniel Earwicker; 03.12.2012
comment
помимо вопроса: являются ли «API классических сокетов» сокетами Беркли или не могли бы вы предоставить ссылку, пожалуйста? :) - person n611x007; 17.04.2013
comment
Да, Беркли или POSIX (достаточно близко к тому же). - person Daniel Earwicker; 17.04.2013
comment
Вместо того, чтобы говорить, что неблокирующий вызов возвращает ошибку, я думаю, было бы правильнее сказать, что неблокирующий вызов делает все возможное, по существу, немедленно, а затем указывает, сколько он сделал. Для некоторых операций объем выполненной работы будет либо все, либо ничего, но некоторые другие операции (например, потоковый ввод-вывод) могут возвращать количественный показатель. Неблокирование семантически эквивалентно блокировке с очень коротким тайм-аутом если реализация блокирующего ввода-вывода позволяет плавно повторить операцию с истекшим временем ожидания (некоторые делают, некоторые нет). - person supercat; 10.09.2014
comment
@ChadNB Да, я думаю, ответ указывает на различия между неблокирующими и асинхронными как таковыми. - person Rick; 06.08.2020

синхронный / асинхронный - это описание отношений между двумя модулями.
блокировка / неблокирование - описание ситуации с одним модулем.

Пример:
Модуль X: I.
Модуль Y: книжный магазин.
X спрашивает Y: у вас есть книга с названием C ++ primer?

  1. блокировка: до того, как Y ответит X, X продолжает ждать ответа. Теперь X (один модуль) блокируется. X и Y - это два потока или два процесса, или один поток, или один процесс? мы НЕ ЗНАЕМ.

  2. неблокирующий: прежде чем Y ответит X, X просто уйдет оттуда и займется другими делами. X может возвращаться каждые две минуты, чтобы проверить, завершил ли Y свою работу? Или X не вернется, пока Y не позвонит ему? Мы не знаем. Мы знаем только, что X может делать другие вещи до того, как Y закончит свою работу. Здесь X (один модуль) неблокирующий. X и Y - это два потока или два процесса или один процесс? мы НЕ знаем. НО мы уверены, что X и Y не могут быть одним потоком.

  3. синхронно: до того, как Y ответит X, X продолжает ждать ответа. Это означает, что X не может продолжать работу, пока Y не закончит свою работу. Теперь мы говорим: X и Y (два модуля) синхронны. X и Y - это два потока или два процесса, один поток или один процесс? мы НЕ ЗНАЕМ.

  4. асинхронный: до того, как Y ответит X, X уходит оттуда, и X может выполнять другие задания. X не вернется, пока Y не позвонит ему. Теперь мы говорим: X и Y (два модуля) асинхронны. X и Y - это два потока или два процесса или один процесс? мы НЕ знаем. НО мы уверены, что X и Y не могут быть одним потоком.


Обратите внимание на два предложения, выделенные жирным шрифтом выше. Почему жирное предложение в 2) содержит два падежа, тогда как жирное предложение в 4) содержит только один падеж? Это ключ к различию между неблокирующим и асинхронным.

Вот типичный пример неблокирующей и синхронной работы:

// thread X
while (true)
{
    msg = recv(Y, NON_BLOCKING_FLAG);
    if (msg is not empty)
    {
        break;
    }
    else
    {
        sleep(2000); // 2 sec
    }
}

// thread Y
// prepare the book for X
send(X, book);

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

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

Например, мы можем спроектировать такую ​​архитектуру:

// Module X = Module X1 + Module X2
// Module X1
while (true)
{
    msg = recv(many_other_modules, NON_BLOCKING_FLAG);
    if (msg is not null)
    {
        if (msg == "done")
        {
            break;
        }
        // create a thread to process msg
    }
    else
    {
        sleep(2000); // 2 sec
    }
}
// Module X2
broadcast("I got the book from Y");


// Module Y
// prepare the book for X
send(X, book);

В приведенном здесь примере мы можем сказать, что

  • X1 не блокирует
  • X1 и X2 синхронны
  • X и Y асинхронны

Если вам нужно, вы также можете описать эти потоки, созданные в X1, четырьмя словами.

Более важные вещи: когда мы используем синхронный вместо асинхронного? когда мы используем блокировку вместо неблокирования? Лучше ли блокировать X1, чем неблокировать? Делать X и Y синхронными лучше, чем асинхронными? Почему Nginx не блокирует? Почему блокируется Apache? Вы должны ответить на эти вопросы.

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

person Yves    schedule 08.07.2015
comment
ИМО - лучший ответ, поскольку он улавливает суть концепции: отношения между одним или двумя участниками. - person whiletrue; 07.08.2018
comment
И в 1, и в 3 Y действует как ОГРАНИЧЕННЫЙ ресурс. Больше нет Y, чтобы помочь X - person UVM; 15.06.2019
comment
Значит ли это, что блокировка и синхронность - это одно и то же? больше похоже на разницу между глаголом и существительным? - person Vineeth Chitteti; 24.06.2020
comment
@VineethChitteti Лучше не говори так. X и Y могут быть синхронными, пока X не блокируется. - person Yves; 27.06.2020

  • Асинхронный относится к чему-то, что выполняется параллельно, например, к другому потоку.
  • Неблокирование часто относится к опросу, то есть проверке выполнения данного условия (сокет доступен для чтения, на устройстве есть больше данных и т. д.)
person Nikolai Fetissov    schedule 12.04.2010
comment
когда задействован ввод-вывод, асинхронный поток обычно не параллелен или не связан с другим потоком, в основном он основан на уведомлениях. то есть: не блокировать, не опрашивать, просто получить сигнал. конечно, можно утверждать, что сигнал исходит из «реального мира», который можно рассматривать как «еще одну нить» ... - person Javier; 13.04.2010
comment
Ну да, о точной формулировке можно спорить целый день :) - person Nikolai Fetissov; 13.04.2010
comment
но как вы объясните AIO в Linux? который использовал как асинхронный, так и неблокирующий. ССЫЛКИ AIO - person Djvu; 20.09.2014
comment
Для всех, кто читает этот ответ: это не спор о точной формулировке. Точно так же параллелизм и параллелизм - это не одно и то же, и их различие не является проблемой формулировок. Асинхронность и параллелизм - два разных зверя, и этот ответ неточно делает их одинаковыми. - person Ptival; 09.08.2016
comment
Асинхронность не обязательно означает, что она выполняется параллельно, см. Этот замечательный сообщение в stackoverflow о параллельном и параллельном программировании. - person BARJ; 27.10.2017

Синхронный определяется как происходящее в одно и то же время.

Асинхронный определяется как то, что не происходит одновременно.

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

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

Самое простое решение - блокировка.

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

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

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

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

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

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

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

А вот и асинхронность.

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

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

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

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

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

И еще одна вещь: вы должны понимать компромиссы, которые обеспечивают все три. Один явно не лучше других. Вспомни мой пример. Если ваш тостер такой быстрый, у вас не будет времени мыть посуду, даже если вы не начнете ее мыть, вот насколько быстр ваш тостер. В таком случае начинать что-то другое - пустая трата времени и усилий. Блокировка подойдет. Точно так же, если мытье посуды займет в 10 раз больше времени, чем поджаривание. Вы должны спросить себя, что для вас важнее? К тому времени тост может остыть и затвердеть, не стоит того, блокировка тоже подойдет. Или вам следует выбрать более быстрые дела, пока вы ждете. Есть более очевидные вещи, но мой ответ уже довольно длинный, я хочу сказать, что вам нужно подумать обо всем этом и о сложностях реализации каждого, чтобы решить, стоит ли оно того, и действительно ли это улучшит вашу пропускную способность или производительность.

Изменить:

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

  1. Также обычно существует четвертая модель, известная как мультиплексная. Это когда вы ждете одну задачу, вы запускаете другую, и пока вы ждете обеих, вы запускаете еще одну и так далее, пока у вас не будет запущено много задач, а затем вы ждете простоя, но на всех их. Итак, как только один из них будет выполнен, вы можете приступить к обработке его ответа, а затем вернуться к ожиданию остальных. Это называется мультиплексированием, потому что пока вы ждете, вам нужно проверять каждую задачу одну за другой, чтобы увидеть, выполнены ли они, ad vitam, пока одна из них не будет выполнена. Это своего рода расширение поверх обычной неблокирующей функции.

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

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

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

person Didier A.    schedule 15.05.2018
comment
Не уверен, почему вы сказали, что синхронизация происходит в одно и то же время? Вся идея в том, что это не происходит одновременно, иначе говоря, не происходит одновременно. - person Helsing; 23.03.2019
comment
Это была отличная аналогия! Вы только что поджарили это! - person d-coder; 18.08.2019
comment
@Helsing Это буквально то, что означает это слово. Синхронный означает одно и то же время, а асинхронный - не одно и то же: стр. Причина асинхронности в том, что это не может произойти одновременно, это должно произойти до или после. Если бы это могло произойти одновременно, вы могли бы просто распараллелить это или сделать это в любом порядке, и вам не потребовалась бы явная синхронизация. Вот почему асинхронное программирование - это то, что нужно делать, потом это, ждать этих вещей, а потом и т. Д. Потому что ни одно из этих действий не может происходить одновременно. - person Didier A.; 20.08.2019
comment
@Helsing Кроме того, concurrent - это не то же самое, что parallel. Это не означает, что две вещи происходят одновременно, это означает только прогресс в более чем одной вещи, прежде чем любая из них завершится. Этого можно добиться с помощью распараллеливания или просто чередования, или переключения задач. - person Didier A.; 20.08.2019
comment
Лучшая аналогия КОГДА-ЛИБО! Кто знал, что можно пролить столько света на непонятный вопрос с помощью простого тоста. Блестяще. Спасибо! - person Steph; 26.09.2020
comment
Думаю, это объяснение превосходит все остальное. Такие приятные аналогии. Спасибо! - person KJ Sudarshan; 23.04.2021
comment
Лучше всего видеть это так. Синхронный - ›упорядоченный. Асинхронный - ›неупорядоченный. - person KJ Sudarshan; 23.04.2021

Помещая этот вопрос в контексте NIO и NIO.2 в java 7, асинхронный ввод-вывод на один шаг более продвинутый, чем неблокирующий. С неблокирующими вызовами java NIO можно было бы установить все каналы (SocketChannel, ServerSocketChannel, FileChannel и т. Д.) Как таковые, вызвав AbstractSelectableChannel.configureBlocking(false). Однако после того, как эти вызовы ввода-вывода вернутся, вам, вероятно, все равно придется управлять проверками, например, если и когда снова читать / писать и т. Д.
Например,

while (!isDataEnough()) {
    socketchannel.read(inputBuffer);
    // do something else and then read again
}

Благодаря асинхронному api в java 7 эти элементы управления можно сделать более универсальными. Один из двух способов - использовать CompletionHandler. Обратите внимание, что оба read вызова не блокируются.

asyncsocket.read(inputBuffer, 60, TimeUnit.SECONDS /* 60 secs for timeout */, 
    new CompletionHandler<Integer, Object>() {
        public void completed(Integer result, Object attachment) {...}  
        public void failed(Throwable e, Object attachment) {...}
    }
}
person Anthony    schedule 21.09.2012
comment
FileChannel нельзя выбрать и настроить на неблокирование. - person michaelliu; 14.03.2014

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

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

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

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

person Mac    schedule 12.04.2010
comment
+1 Хороший ответ. Люди должны знать, что асинхронность может означать либо неблокирование, или асинхронный подход Microsoft (на основе событий / обратный вызов). - person Engineer; 13.12.2011

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

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

person Koray Tugay    schedule 27.02.2015
comment
неблокирование не возвращает никакого результата вообще ничего - person Nüsrat Nuriyev; 09.10.2019

Блокирующий вызов: управление возвращается только после завершения вызова.

Неблокирующий вызов: управление немедленно возвращается. Позже ОС каким-то образом уведомляет процесс о завершении вызова.


Синхронная программа: программа, использующая блокирующие вызовы. Чтобы не зависать во время вызова, в нем должно быть 2 и более потоков (поэтому он называется синхронным - потоки работают синхронно).

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

person Babken Vardanyan    schedule 02.05.2014
comment
Неблокирующий вызов: управление возвращается после выполнения всех возможных действий практически сразу; метод показывает, сколько было сделано. Это отличается от асинхронного вызова, который ведет себя так, как вы описали для блокировки вызова. - person supercat; 09.09.2014

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

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

person Frank Schwieterman    schedule 12.04.2010
comment
@Marenz означает, что вы не можете использовать неблокирующий io напрямую с вызовами posix. Это не меняет смысла, который он здесь дает. - person tmc; 20.07.2011
comment
@Marenz Это означает только то, что флаг игнорируется для файлов. Это не влияет на смысл этого ответа. - person user207421; 02.04.2018

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

Асинхронный означает совместное начало, не гарантируется последовательность результата

Блокировка означает что-то, что вызывает препятствие для выполнения следующего шага.

Неблокирование означает что-то, что продолжает работать, ничего не дожидаясь, преодолевая препятствие.

Пример блокировки: я стучу в дверь и жду, пока они ее откроют. (Я здесь без дела)

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

Синхронно, например: я выйду, только если пойдет дождь. (существует зависимость)

Асинхронный, например: я выйду. Может пойти дождь. (независимые события, не имеет значения, когда они происходят)

Синхронный или асинхронный, оба могут быть блокирующими или неблокирующими, и наоборот

person KJ Sudarshan    schedule 23.04.2021

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

person P.Gurung    schedule 03.03.2018

Проще говоря,

function sum(a,b){
return a+b;
}

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

person Rafique Mohammed    schedule 15.07.2021

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

person stonemetal    schedule 12.04.2010

Блокировка: элемент управления возвращается к вызову прецессии после завершения обработки примитива (синхронизация или асинхронизация).

Неблокирующий: управление возвращается в действие сразу после вызова.

person Moslema    schedule 20.11.2011
comment
Это даже не отвечает на вопрос. - person Koray Tugay; 27.02.2015