Синхронный определяется как происходящее одновременно.
Асинхронный определяется как не происходящий одновременно.
Это то, что вызывает первое замешательство. Синхронный на самом деле то, что известно как параллельный. Пока асинхронный последовательный, сделайте это, затем сделайте это.
Теперь вся проблема заключается в моделировании асинхронного поведения, потому что у вас есть какая-то операция, для которой требуется ответ другой, прежде чем она может начаться. Таким образом, это проблема координации, как вы узнаете, что теперь можете начать эту операцию?
Самое простое решение известно как блокировка.
Блокировка - это когда вы просто решаете подождать, пока другая вещь будет выполнена, и вернете вам ответ, прежде чем переходить к операции, которая в нем нуждалась.
Так что, если вам нужно положить масло на тост, и, таким образом, вам сначала нужно поджарить разводимого. Вы могли бы скоординировать их так, чтобы сначала вы жарили их, а затем бесконечно смотрели на тостер, пока он не поднимется, а затем вы продолжите наливать на них масло.
Это самое простое решение, и оно работает очень хорошо. Нет никакой реальной причины не использовать его, если у вас нет других вещей, которые вам нужно делать, которые не требуют координации с операциями. Например, мыть посуду. Зачем ждать, уставившись на тостер, чтобы тост выскочил, если вы знаете, что это займет немного времени, и вы можете помыть целое блюдо, пока оно заканчивается?
Здесь вступают в игру два других решения, известных как неблокирующие и асинхронные.
Неблокирующая - это когда вы решаете делать другие несвязанные вещи, пока ожидаете завершения операции. Проверка доступности ответа по вашему усмотрению.
Так что вместо того, чтобы смотреть на тостер, чтобы он лопнул. Вы идете и моете целое блюдо. И затем вы смотрите на тостер, чтобы увидеть, если тосты лопнули. Если они этого не делают, вы идете мыть другое блюдо, проверяя тостер между каждым блюдом. Когда вы видите, что тосты лопнули, вы прекращаете мыть посуду, вместо этого вы берете тост и переходите на то, чтобы налить на него сливочное масло.
Хотя постоянно проверять тосты может раздражать, представьте, что тостер находится в другой комнате. В перерывах между блюдами вы тратите время на то, чтобы сходить в другую комнату, чтобы проверить тост.
Здесь идет асинхронный.
Асинхронный - это когда вы решаете делать другие несвязанные вещи, пока ожидаете завершения операции. Однако вместо того, чтобы проверять его, вы делегируете работу по проверке чему-то другому, это может быть сама операция или наблюдатель, и вы должны уведомить об этом и, возможно, прервать вас, когда ответ будет доступен, чтобы вы могли перейти к другой операции, нужно было.
Это странная терминология. Не имеет большого смысла, так как все эти решения являются способами создания асинхронной координации зависимых задач. Вот почему я предпочитаю называть его вечерним.
Итак, для этого вы решили обновить тостер, чтобы он подал звуковой сигнал, когда тосты будут готовы. Вы постоянно слушаете, даже когда вы моете посуду. Услышав звуковой сигнал, вы встаете в очередь в своей памяти, что, как только вы закончите мыть блюдо, вы остановитесь и положите масло на тост. Или вы можете прервать мытье текущего блюда и сразу же разбираться с тостами.
Если у вас возникли проблемы со слухом, вы можете попросить своего партнера посмотреть тостер и сказать, когда тост будет готов. Ваш партнер может сам выбрать любую из трех вышеперечисленных стратегий, чтобы координировать свою задачу: наблюдать за тостером и сообщать вам, когда он будет готов.
В заключение отметим, что хорошо понимать, что хотя неблокирование и асинхронность (или то, что я предпочитаю называть вечерними) действительно позволяют вам делать другие вещи во время ожидания, у вас их тоже нет. Вы можете постоянно проверять состояние неблокирующего вызова, ничего не делая. Хотя это часто хуже, чем блокирование (например, глядя на тостер, затем в сторону, затем возвращайтесь к нему до тех пор, пока оно не будет сделано), поэтому многие неблокирующие API-интерфейсы позволяют переходить из него в режим блокировки. Для Evented, вы можете просто подождать, пока вы не получите уведомление. Недостатком в этом случае является то, что добавление уведомления было сложным и потенциально дорогостоящим с самого начала. Вы должны были купить новый тостер с функцией звукового сигнала или убедить своего партнера посмотреть его за вас.
И еще одна вещь, вам нужно понять компромиссы, которые обеспечивают все три. Одно явно не лучше, чем другие. Подумай о моем примере. Если ваш тостер очень быстрый, у вас не будет времени помыть посуду, даже не начать мыть ее, вот как быстро ваш тостер. Начать с чего-то другого в этом случае - просто трата времени и усилий. Блокировка будет делать. Точно так же, если мытье посуды займет в 10 раз больше времени, чем поджаривание. Вы должны спросить себя, что важнее сделать? К тому времени тост может стать холодным и твердым, не стоит, блокировка тоже подойдет. Или вы должны выбрать более быстрые вещи, пока вы ждете. Это более очевидно, но мой ответ уже довольно длинный, я хочу сказать, что вам нужно подумать обо всем этом и о сложности реализации каждого из них, чтобы решить, стоит ли это того, и действительно ли это улучшит вашу производительность или производительность. *
Edit:
Несмотря на то, что это уже долго, я также хочу, чтобы это было завершено, поэтому я добавлю еще два пункта.
1) Также обычно существует четвертая модель, известная как мультиплексированная . Это когда вы ожидаете одну задачу, вы запускаете другую, и пока вы ждете обе, вы запускаете еще одну и т. Д., Пока у вас не будет запущено много задач, а затем вы ожидаете простоя, но на всех их. Поэтому, как только это будет сделано, вы можете приступить к обработке его ответа, а затем вернуться к ожиданию остальных. Он называется мультиплексным, потому что пока вы ждете, вам нужно проверять каждую задачу одну за другой, чтобы убедиться, что они выполнены, до тех пор, пока одна из них не будет выполнена. Это что-то вроде расширения поверх обычной неблокировки.
В нашем примере это было бы похоже на запуск тостера, затем посудомоечной машины, затем микроволновой печи и т. Д., А затем ожидание любого из них. Где бы вы ни проверили тостер, чтобы убедиться, что он готов, если нет, то вы проверите посудомоечную машину, если нет, микроволновку и еще раз.
2) Хотя я считаю, что это большая ошибка, синхронное часто используется для обозначения одной вещи за раз. И много асинхронных вещей одновременно. Таким образом, вы увидите синхронную блокировку и неблокирование, используемые для обозначения блокирования и неблокирования. А асинхронные и неблокирующие блоки используются для обозначения мультиплексированных и четных.
Я не очень понимаю, как мы туда попали. Но когда дело доходит до ввода-вывода и вычислений, синхронные и асинхронные часто относятся к тому, что более известно как неперекрывающиеся и перекрывающиеся. То есть асинхронный означает, что ввод-вывод и вычисления накладываются друг на друга, то есть происходят одновременно. В то время как синхронно означает, что это не так, это происходит последовательно. Для синхронной неблокировки это означает, что вы не запускаете другие операции ввода-вывода или вычисления, а просто заняты ожиданием и имитацией блокирующего вызова. Я бы хотел, чтобы люди перестали злоупотреблять синхронным и асинхронным. Так что я не поощряю это.