Итак, чтобы ответить на ваш первый и второй вопрос:
Неблокирование фактически то же самое, что и асинхронный - вы делаете вызов, и вы получите результат позже, но пока это происходит, вы можете делать что-то еще. Блокировка - наоборот. Вы ждете звонка, прежде чем продолжить свое путешествие.
Теперь асинхронный / неблокирующий код звучит просто фантастически, и это так. Но у меня есть слова предупреждения. Асинхронный / неблокирующий режим отлично подходит для работы в ограниченных средах, например, в мобильном телефоне ... рассмотрите ограниченный ЦП / память. Это также хорошо для интерфейсной разработки, когда ваш код должен каким-то образом реагировать на виджет пользовательского интерфейса.
Асинхронность имеет фундаментальное значение для того, как все операционные системы должны работать - они делают дерьмо за вас в фоновом режиме и будят ваш код, когда они сделали то, что вы просили, а когда этот вызов терпит неудачу, вам говорят, что это не так. работают либо по исключению, либо по какому-либо объекту кода возврата / ошибки.
В тот момент, когда ваш код запрашивает что-то, на что потребуется время для ответа, ваша ОС знает, что может заняться другими делами. Ваш код - процесс, поток или эквивалент, блоки. Ваш код полностью не обращает внимания на то, что еще происходит в ОС, пока он ожидает установления этого сетевого подключения, или пока он ждет этого ответа от HTTP-запроса, или пока он ожидает этого чтения / записи файла, и скоро. Ваш код может «просто» ждать щелчка мыши. То, что на самом деле происходило в то время, было то, что ваша ОС плавно управляла, планировала и реагировала на «события» - вещи, на которые ОС обращает внимание, например, управление памятью, ввод-вывод (клавиатура, мышь, диск, Интернет), другие задачи, восстановление после сбоя и т. д.
Операционные системы чертовски жесткие. Они действительно хороши в сокрытии всего сложного асинхронного / неблокирующего материала от вас, программиста. Именно так большинство программистов пришли к тому, что мы имеем сегодня с программным обеспечением. Сейчас мы достигли пределов ЦП, люди говорят, что для повышения производительности можно делать что-то параллельно. Это означает, что асинхронный / неблокирующий режим кажется очень подходящим вариантом, и да, если ваше программное обеспечение требует этого, я могу согласиться.
Если вы пишете внутренний веб-сервер, действуйте осторожно. Помните, что вы можете масштабировать по горизонтали гораздо дешевле. Netflix / Amazon / Google / Facebook - очевидные исключения из этого правила просто потому, что для них дешевле использовать меньше оборудования.
Я скажу вам, почему асинхронный / неблокирующий код - это кошмар для серверных систем ...
1) Это превращается в отказ в обслуживании продуктивности ... вам нужно гораздо больше думать, и вы делаете много ошибок на этом пути.
2) Следы стека в реактивном коде становятся неразборчивыми - трудно понять, что называется, что, когда, почему и как. Удачи с отладкой.
3) Вы должны больше думать о том, как что-то терпит неудачу, особенно когда многие вещи выходят из строя по сравнению с тем, как вы их отправили. В старом мире вы делали одно дело за раз.
4) Сложнее проверить.
5) Сложнее поддерживать.
6) Это больно. Программирование должно доставлять удовольствие и веселье. Только мазохисты любят боль. Люди, которые пишут параллельные / реактивные фреймворки, - садисты.
И да, я написал как синхронизацию, так и асинхронность. Я предпочитаю синхронный, поскольку 99,99 серверных приложений могут справиться с этой парадигмой. Фронтенд-приложениям, без сомнения, нужен реактивный код, и так было всегда.
Да, код может быть асинхронным, неблокирующим И основанным на событиях.
Самое важное в программировании - убедиться, что ваш код работает и реагирует в приемлемое время. Придерживайтесь этого ключевого принципа, и вы не ошибетесь.