Значение асинхронного против синхронного [закрыто]

46

Что означает слова асинхронные и синхронные в информатике?

Если вы гуглите значение слов, вы получите следующее:

Но похоже, что они используются для передачи противоположного значения в программировании или информатике:

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

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

Мухаммед Назайер
источник
47
Мне легко сказать: если я не понимаю, как работает код и ошибки внезапно исчезают, когда я их ищу, код, вероятно, асинхронный. :)
Эрик Думинил
4
Печальная истина заключается в том, что в области программирования эти слова со временем стали означать обратное тому, что они иначе означают. Могут быть исторические причины их нынешнего значения, но нет веских оснований.
Секрет Соломонова
3
В то же время, что и есть, ключ :)
Легкость гонок с Моникой
5
Фактическая операция не (обязательно) происходит в то же время , как функция вызывается против операции действительно происходит в то же время функция вызывается ... не кажется назад ко мне? Если я описываю функцию как асинхронную, я говорю, что то, что она делает, не обязательно произойдет одновременно с ее вызовом.
Affe
2
«последовательный» и «непоследовательный», возможно, были семантически лучшим выбором, но у этого корабля уже есть путь, путь уже пройден.
Джаред Смит

Ответы:

47

Я хотел бы дать вам ответ, который напрямую связан с теми определениями, которые вы нашли. Когда одна задача T1 запускает вторую задачу T2, это может произойти следующим образом:

Синхронный: существующий или встречающийся одновременно.

Таким образом, T2 гарантированно запускается и выполняется во временном интервале T1 . T1 «ждет» окончания T2 и может продолжить обработку позже. В этом смысле T1 и T2 происходят «одновременно» (не «параллельно», а в непрерывном интервале времени).

Асинхронный: не существует или не происходит одновременно.

Таким образом, время выполнения T2 теперь не связано с T1. Это может быть выполнено параллельно, это может произойти через одну секунду, одну минуту или несколько часов спустя, и T2 может все еще работать, когда закончился T1 (таким образом, чтобы обработать результат T2, может потребоваться новая задача T3). В этом смысле T1 и T2 не "происходят в одно и то же время (интервал)".

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

Док Браун
источник
4
Жаль, что так много голосов, потому что я думаю, что это неправильно. Синхронные методы выполняются один за другим, потому что второй метод должен ждать завершения первого (блокирующего) метода. Эти два метода явно не выполняются одновременно.
Роберт Харви
6
Нет, я не думаю, что сделал. Синхронность и одновременность не одно и то же.
Роберт Харви
1
Я хочу заявить, что определения словаря не очень полезны для разработчиков программного обеспечения. Попытка сопоставить определения словаря с используемыми нами техническими терминами, вероятно, бесполезна.
Роберт Харви
1
В любом случае, ваши правки улучшают ситуацию, но слова «существующие или возникающие одновременно» смешивают ваши описания. Синхронные методы не выполняются «одновременно»; они выполняются в упорядоченной последовательности , что делает их синхронными.
Роберт Харви
1
@RobertHarvey Определения в словаре работают отлично, если вы используете правильную перспективу. Вы все одержимы временем казни. Инструкции имеют срок службы вне того времени, когда они выполняются. Последовательные инструкции перемещаются синхронно так же, как пули в револьвере движутся синхронно. Аналогично инструкции могут перемещаться синхронно через конвейеры команд. Хватит зацикливаться на перспективе исполнения. Много дерьма случается с инструкциями, прежде чем они выполняются.
Candied_Orange
20

Я считаю, что лучший способ понять это следующее:

  • Синхронный: мы знаем, когда это произойдет (это происходит, когда заканчивается этот другой код).
  • Асинхронный: мы не знаем, когда это произойдет.

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


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

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

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


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

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

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

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

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


Вас также может заинтересовать разница между «параллельным» и «параллельным» исполнением? ,

Theraot
источник
Именно так. Описание, найденное ОП, звучит гораздо больше о параллелизме, чем синхронности (если это слово ...). asynch vs synch - это когда начинается действие (прямо сейчас, когда я его вызываю, или позже, когда решает планировщик), в то время как параллель означает «да, они происходят одновременно», а не последовательно.
Джакомо Альзетта
1
@GiacomoAlzetta Я думаю, что слово это синхронизм. Я также нашел эти похожие слова: синхронизация, синхронность и синхронность. Вероятно, стоит свой вопрос.
Theraot
12

Асинхронный: не существует или не происходит одновременно.

Синхронный: существующий или встречающийся одновременно.

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

Это действительно сбивает с толку!

Рассмотрим вместо этого значения синхронизированных и несинхронизированных . Две вещи синхронизируются, если время одного зависит от другого, и несинхронизируются, если их время не связано.

В вашем примере асинхронного рабочего процесса происходит две вещи: выполнение скрипта и разбор html. Эти две вещи не синхронизированы ; время выполнения операции и время операции синтаксического анализа не зависят друг от друга. Если мы сделаем рабочий процесс синхронным , то операции станут синхронизированными . Скажем, выполнение не начинается, пока разбор точно не закончится.

Но важно понимать, что на самом деле здесь есть три возможности:

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

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

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

  • awaitОператор в языках программирования, как C # является операцией упорядочения на асинхронных рабочих процессах. Ожидание - это асинхронное ожидание ; это точка , в которой мы выражаем отношение порядка между двумя частями асинхронного процесса, и сказать , что это «происходит до» отношений между кодом перед ОЖИДАНИЕМ и кодом после ОЖИДАНИЯ. Вот как мы реализуем третий вариант .

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

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

Эрик Липперт
источник
6

Я инженер-электрик, и мы имели дело с синхронными и асинхронными в логических схемах (логические элементы).

Допустим, у вас есть логический элемент И (или любой вентиль), который имеет два входа и выход.

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

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

DrOnline
источник
1
Как асинхронный / синхронный последовательный порт.
Jiwopene
2

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

  • Спутник А имеет период вращения вокруг Земли, так что за каждый полный оборот планеты спутник вращается вокруг Земли более или менее одного раза .
  • У спутника B период вращения вокруг Земли такой, что за каждый полный оборот планеты спутник совершает кругосветное движение вокруг Земли ровно один раз .

Спутник B в приведенном выше примере находится на геосинхронной орбите, как определено

имеющий период вращения, синхронный с периодом вращения Земли.

Нельзя утверждать, что спутник А является геосинхронным просто потому, что он «существует или происходит одновременно с планетой». На самом деле, сам спутник B тоже не то, что имеет значение, а то, что имеет значение, это период вращения, который синхронизирован с периодом вращения Земли. Дело не в одновременном существовании объектов; речь идет об отношениях между объектами. Держи эту мысль.

Предположим, я говорю вам, что два потока в системе работают одновременно. Поток A (TA) извлекает данные для процесса A, а поток B (TB) извлекает данные для процесса B. Я спрашиваю вас: «Являются ли TA и TB асинхронными?». Ваш ответ будет: «Как я мог знать? Мне нужно было видеть код, который вызывал их в соответствующих процессах». На что я возразил бы в своей попытке быть хитрым: «Но я говорю вам, что ТА и ТБ определенно работают одновременно».

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

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

func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}

Из нашего предыдущего обсуждения спутников: «Речь идет не об одновременном существовании объектов, а об отношениях между объектами». Речь идет не о существовании вызывающего метода и вызываемого метода; речь идет о существовании взаимосвязи между исполнением вызывающего и исполнением вызванного. Если мы посмотрели на системные потоки и обнаружили, что он DoThatAsync()был вызван, но не выполняется, возможно, он ожидает в планировщике или каком-либо другом вводе / выводе, это не обязательно означает, что вызывающий метод Invoker()не выполняется - есть работа, которую он мог бы делать Конечно, это может быть в точке awaitING DoThatAsync(), но не гарантируется. Это не относится к другим функциям после их вызова - если они останавливаются,Invoker()останавливается - несмотря ни на что. Это гарантировано. Выполнение между Invoker()и вызванным синхронным методом «существует или происходит одновременно».

8protons
источник
Мне это нравится на самом деле. В общем, это дикий запад произвольного выполнения как «асинхронный» против четкого пути выполнения, определенного как «синхронный»
Cruncher
Я также думаю, что это лучший ответ.
Бармар
2

Конкретные примеры

Я хотел бы добавить несколько реальных примеров и соединить их с миром разработки программного обеспечения. Во-первых, подумайте над тем, что, как я надеюсь, соответствует вашему интуитивному определению «синхронный»: мигание светлячков при некоторых обстоятельствах. Во- вторых, рассмотрим релейный олимпийский 4х100 женщин гонки . В-третьих, подумайте над тем старым следом из военных фильмов: «Мужчины, синхронизируйте свои часы!»

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

Анализ

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

Итак, как может группа светлячков, у которых, по-видимому, нет Apple SmartWatch и NTP, чтобы управлять ими, может одновременно прошить свои задние части? Что ж, это довольно легко, если у них есть возможность установить постоянный темп и внести небольшие изменения в него. Они просто мигают, и если сразу после них мигает больше людей, они замедляются (увеличивают задержку), тогда как, если больше вспышек прямо перед ними, они ускоряются (уменьшают задержку). Таким образом, они могут использовать простой процесс обратной связи для достижения практически одинакового темпа и фазы. Здесь важно отметить, что они достигают синхронности, ожидая подходящего момента, чтобы вспыхнуть .

Гонка 4х100 интересна тем, что вы видите обе формы хронометража процесса в действии: бегуны внутри команды синхронизируются, а бегуны в разных командах «асинхронны». Второй участник в реле должен дождаться, пока первый участник войдет в зону передачи . Передача - это синхронное событие между этими двумя бегунами. Тем не менее, бегуны на разных дорожках не заботятся о том, что происходит на другой дорожке , и, скорее всего, не замедляются и не выполняют синхронизацию самостоятельно. Каждая дорожка бегунов асинхронна по отношению друг к другу. Опять же, мы видим, что синхронизация влечет за собой ожидание, а асинхронность - нет.

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

Определяющая особенность

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

Водитель, доставляющий посылку, и скорая помощь, доставляющая кого-то в больницу, обычно не разделяют какие-либо моменты времени, которые мы определяем как «точку синхронизации». С другой стороны, светлячки, мигающие в унисон, имеют точку синхронизации каждый раз, когда они мигают, ретрансляторы имеют точку синхронизации каждый раз, когда они передают эстафету, а солдаты имеют точку синхронизации, когда они начинают свою атаку. Если вы можете идентифицировать одну или несколько точек синхронизации, то процессы синхронизируются . Это должно быть легко понять, потому что «syn-» - это греческий префикс, означающий «с» или «вместе», а «chrono» - греческий корень «времени». «Синхронизированный» буквально означает «одновременно»,

границы

Обратите внимание, что «синхронизация» не обязательно применяется ко всему времени жизни одного или обоих процессов. Я бы сказал, что это относится только к «времени ожидания до и включая точки (точки) синхронизации». Таким образом, два процесса могут работать асинхронно до тех пор, пока они не достигнут состояния, в котором им нужно общаться, затем они синхронизируются, обмениваются информацией и после этого продолжают асинхронно. Простой пример - встреча с кем-то за кофе. Очевидно, что встреча является точкой синхронизации (или, скорее, многими), и тот факт, что два человека прибывают в эту точку, демонстрирует синхронность. Однако мы бы не сказали, что из-за того, что два человека встретились за кофе, эти две человеческие жизни"синхронизированы". Возможно, это был единственный момент в их жизни, который они встретили, и все остальное, что они делают, в остальном является независимым.

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

Подключение программного обеспечения

Теперь давайте подумаем об очень фундаментальной задаче в программном обеспечении: чтение из файла. Как вы, вероятно, знаете, запоминающее устройство обычно в тысячи-миллионы раз медленнее, чем кеш или основная память. По этой причине операционные системы и библиотеки языков программирования обычно предлагают как синхронные, так и асинхронные операции ввода-вывода. Теперь, даже если ваша программа имеет только один поток, вы должны думать об ОС как о «отдельном процессе» для целей этого обсуждения.

Синхронизация

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

В этом случае поток вашей программы и процесс ввода-вывода ОС не «происходят (действуют) одновременно», и поэтому странно говорить, что эти процессы «синхронизированы». Но это неправильный взгляд на это! Это все равно что сказать: «Бегуны в эстафетной команде не бегут одновременно, поэтому они не синхронизируются». На самом деле оба утверждения неверны! Бегуны в эстафетной команде делают и должны бежать в одно и то же время, но только в очень специфический момент: передача эстафеты. Фактически, только этот особенный момент во время гонки убеждает нас в том, что эстафетные команды синхронизированы для начала! Если мы рассматриваем запрос и ответ ввода-вывода как «жезл»,

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

Разнообразие процессов

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

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

асинхронный

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

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

параллелизм

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

Теперь, когда мы помечаем некоторый код как «асинхронный», это выглядит забавно, потому что это подразумевает, что остальной код, не помеченный как «синхронизированный». Что это вообще значит? Разве мы не настаивали на том, что для «синхронизации» нужны два танго? Но что, если мы говорим о выполнении кода в одном потоке? В этом случае нам нужно сделать шаг назад и представить программу как последовательность состояний и переходов между этими состояниями. Оператор в программе вызывает переход состояния. Мы можем думать об этом как о «микропроцессе», который начинается и заканчивается заявлением. Точки последовательности, определяемые языком, фактически являются точками синхронизации этих «микропроцессов». И, таким образом, мы можем просматривать однопоточные,

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

К настоящему времени должно быть ясно, что мы подразумеваем под «асинхронностью». Это точно означает, что подразумеваемый контракт синхронности в блоке кода освобождается для асинхронного блока. Разрешается обновлять состояние программы независимо, без гарантий безопасности, обычно подразумеваемых последовательной (практически последовательной, синхронной) моделью вычислений. Конечно, это означает, что мы должны быть особенно внимательны, чтобы не нарушать состояние программы с несогласованностью. Обычно это означает, что мы вводим ограниченную явную синхронность для координации с асинхронным блоком. Обратите внимание, что это означает, что асинхронный блок может быть как асинхронным, так и синхронным в разное время! Но напоминая, что синхронизация просто указывает на существование точки синхронизации, у нас не должно возникнуть проблем с принятием этого понятия.

Газонокосилка человек
источник
Вы можете удалить все свои примеры здесь, за исключением эстафеты (которая четко иллюстрирует понятия программного обеспечения о синхронности и асинхронности, в то время как другие этого не делают), и ваш ответ значительно улучшится.
Роберт Харви
Я думаю, что другие примеры демонстрируют одновременное действие против гетерогенного действия, которое, я считаю, вызвало большую путаницу ОП.
Газонокосилка Man
1

Один из способов думать об этом - SIMD- инструкции, такие как AVX . Вот несколько примеров того, как они используются.

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

В то время как асинхронная многопоточность позволяет выполнять несколько вычислений в «возможно» «несколько» «схожие» времена.

Объедините это со следующими определениями:

синхронное прилагательное syn · chro · nous | \ ˈSiŋ-krə-nəs, insin-

1: происходящее, существующее или возникающее одновременно [выделено мной]

асинхронное прилагательное asyn · chro · nous | \ (ˌ)--ˈsiŋ-krə-nəs, -ˈsin- \

1: [...]: не синхронно

Питер
источник
1

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

Представьте, что вы делаете макароны. У вас есть три шага:

  1. Отварить и процедить макароны
  2. Приготовить соус
  3. Смешайте пасту и соус

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

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

Многопоточный метод. Теперь представьте, что вы нанимаете нового повара. Теперь у вас есть два повара (темы). Пока один повар готовит макароны, второй готовит соус. Это необходимо в этом сценарии? Нет, потому что приготовление макаронных изделий достаточно просто, чтобы быть эффективным с помощью асинхронного метода. А управление несколькими поварами - это дополнительные накладные расходы. Но если вы готовите более сложное блюдо или несколько блюд одновременно, полезно несколько поваров.

Бобек
источник
На самом деле это довольно хорошая аналогия.
Роберт Харви
0

Хороший вопрос и термины, которые часто используются по-разному, что приводит к путанице.

Мой ответ заключается в том, что эти термины относительны - и то, к чему они относятся, является основной программой, которая выполняется (или иногда потоком).

Эти термины определяют что-то о внутренней работе и времени выполнения программы, в зависимости от того, отправляются или принимаются сообщения блокирующим способом (синхронизация) или неблокирующим способом (асинхронный). Если (основной) поток блокируется отправкой или получением, то это «синхронизация», и если он каким-то образом прерывается, то это «асинхронный». Повторим, что эти термины относятся к реализациям, которые выполняют (обычную) работу, а также обрабатывают события.

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

Эрик Эйдт
источник
Неблокирование отличается от асинхронного,
user207421
1
@ user207421, пожалуйста, уточни, потому что я бы назвал их синонимами в этом контексте
Джейкоб Райл
0

«синхронный» означает, что два события происходят одновременно - но какие события?

Когда мы говорим «синхронное выполнение», мы имеем в виду, что вызывающий и вызываемый выполняются (то есть в стеке) одновременно. Это, вероятно, смысл, который вы после.

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

Когда мы говорим «синхронная модель» в контексте распределенных систем, мы имеем в виду, что все узлы выполняют свои программы в режиме блокировки, и сообщения, отправленные на этапе n, гарантированно поступят в начале этапа n + 1.

Когда в спецификации языка Java говорится, что поток «синхронизируется» с другим, это означает, что действия в разных потоках происходят «одновременно» (по отношению к взаимосвязи «происходит до»). И когда они говорят, что два потока «синхронизируют доступ к объекту», они фактически означают, что потоки синхронизируются друг с другом, чтобы гарантировать, что они никогда не будут работать с объектом одновременно.

... и я уверен, что вы могли бы применить это слово в еще большем количестве контекстов, потому что "все происходит одновременно" - это довольно общая идея :-)

меритон - забастовка
источник
0

Я думаю, что ключ вашей путаницы может быть подытожен:

Атрибут async означает, что скрипт будет выполнен, как только он будет загружен, даже если html все еще анализирует

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

В программировании синхронный означает:

Все интересующие вас данные уже существуют в памяти во время выполнения вашей логики

Хотя асинхронный означает:

Некоторые из данных, которые вас интересуют, еще не существуют и существуют только в какой-то момент в будущем

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

Как обычно загружаются сценарии, это приостановка синтаксического анализа html, затем загрузка сценария, когда загрузка сценария завершается, выполняется, а затем продолжается анализ html. Синтаксический анализ html и выполнение скрипта происходит в «одно и то же время» (то же самое время, а не одновременно).

Как asyncзагружаются сценарии, HTML видит тег сценария, а затем запоминает его для загрузки в будущем, но продолжает анализ. Разбор html не приостанавливается для загрузки скрипта. Позже , после разбора html все асинхронные сценарии загружаются и выполняются. Синтаксический анализ html и выполнение скрипта не происходят одновременно (опять же, в одно и то же время, означая вместе, в этом случае они выполняются отдельно).

Итак, подведем итог:

  • Синхронные сценарии анализируются вместе с HTML.

  • Асинхронные сценарии анализируются отдельно в будущем.

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

slebetman
источник