Какая разница между: асинхронной, неблокирующей, архитектурой Event-Base?

  • Какая разница между:

    • Асинхронный
    • Неблокирование и
    • Архитектуры событий
  • Может ли быть как асинхронная, так и неблокирующая (и основанная на события)?

  • Что самое важное в программировании, чтобы иметь что-то: асинхронное, неблокирующее и/или event-base (или все 3)?

Если бы вы могли привести примеры, это было бы здорово.

Этот вопрос задается, потому что я читал эту замечательную статью qaru.site/info/25610/... по аналогичной теме, но она не отвечает на мои вопросы выше.

Ответ 1

Асинхронный Асинхронно буквально означает не синхронный. Электронная почта является асинхронной. Вы отправляете почту, вы не ожидаете получить ответ СЕЙЧАС. Но он не является неблокирующим. По сути, это означает, что архитектура, где "компоненты" отправляют сообщения друг другу, не ожидая ответа немедленно. HTTP-запросы синхронны. Отправьте запрос и получите ответ.

Неблокирующий Этот термин в основном используется с IO. Это означает, что когда вы выполняете системный вызов, он немедленно возвращается с каким бы то ни было результатом, не заставляя ваш поток спать (с большой вероятностью). Например, неблокирующие вызовы чтения/записи возвращаются с тем, что они могут сделать, и ожидают, что вызывающий абонент снова выполнит вызов. Например, try_lock - это неблокирующий вызов. Он будет блокироваться только в том случае, если блокировка может быть получена. Обычная семантика для системных вызовов является блокировкой. read будет ждать, пока он не получит некоторые данные, и перетащите вызывающий поток в режим сна.

Event-база Этот термин происходит от libevent. неблокирующие вызовы чтения/записи сами по себе бесполезны, потому что они не говорят вам "когда", если вы их перезвоните (повторите попытку). select/epoll/IOCompletionPort и т.д. - это разные механизмы для поиска из ОС "когда" ожидается, что эти вызовы возвратят "интересные" данные. libevent и другие подобные библиотеки предоставляют оболочку для этих средств мониторинга событий, предоставляемых различными операционными системами, и предоставляют совместимый API для работы с которыми работает через операционные системы. Неблокирующий IO идет рука об руку с Event-базой.

Я думаю, что эти термины перекрываются. Например, HTTP-протокол является синхронным, но реализация HTTP с использованием неблокирующего IO может быть асинхронной. Опять же, неблокирующий вызов API, такой как read/write/try_lock, является синхронным (он сразу дает ответ), но "обработка данных" является асинхронной.

Ответ 2

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

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

В архитектуре с блокирующим чтением код будет ждать до тех пор, пока не поступит 1 000 байт или не решит отказаться.

В архитектуре с асинхронным чтением код скажет драйверу, что он хочет 1000 байт, и будет уведомлен о прибытии 1000 байт.

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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

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

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