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