Программы
Почему асинхронность – это сложно?

Почему асинхронность – это сложно?

Что не так с асинхронностью? Почему программисты и студенты так плохо её понимают?

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

Мы не будем рассматривать примеры кода в данной заметке – сравнительно скоро появится пример реализации на Си, а также в рамках стартующего курса по Python мы напишем свой event-loop.

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

Да даже в технологиях стараются синхронизировать движение различных деталей – вспомните те же паровозы: все колёса объединены, чтобы двигаться одновременно и с одной частотой. И IT-не исключение – зря что ли таймеры понатыканы в различные контроллеры? Или почему частота шины фиксируется?

Нет, асинхронность – это то, с чем борются. Но, видимо, получают какой-то профит, раз всё равно пользуются...

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

И после подобного можно получить ответ студента, который слышал что-то про асинхронность: "С асинхронностью мы можем не ждать результата выполнения операции" – один из частых вариантов интерпретации этого подхода. Нет, здорово получается: купили мы товар у продавца, он ушёл на склад за товаром, или даже создал заявку на доставку из другого города... А мы ушли дальше без товара – купить то купили, а получить и пользоваться – для слабаков!

И тут надо добавить некоторое "как мы это делаем". По сути, цели наши не поменялись: нам всё также нужно получить тот товар. И мир не изменился – товар всё также далеко. Да и логистика та же – быстрее товар не доедет от того, что мы теперь пользуемся неблокирующим подходом. Меняется лишь наше отношение к этому: мы не остаёмся ждать, мы продолжаем заниматься нашими повседневными делами, временами (или по звонку продавца) заходя в магазин, чтобы узнать: приехала посылка или нет. И чтобы продавец нас узнал – показываем квитанцию об оплате, где указана наша посылка.

Это и есть наша "событийная петля". А квитанция – промис, футур и тому подобное.

Мы не можем начать пользоваться нашей покупкой раньше. По факту, мы её получим даже чуть позже – сидя дни напролёт около прилавка, мы получим своё быстрее всего. Но сколько мы потеряем времени? А вот заглядывая на обеде в магазин, мы можем получить посылку чуть ли ни на день позже... Но при этом живём полной жизнью!

Так что эта самая "вредная" асинхронность есть и в нашей жизни. Более того, она помогает комфортнее жить, когда все стороны взаимодействия готовы к такому подходу. Именно подходу, а не технологии. А раз это подход – он применим во многих сферах!