Дэвдэд
Автор — @mccalen. Рекламу не продаю
Post #395
1.12K
За что отвечает ключевое слово async?
У каждого спрашивали на собеседовании про модификатор async, большинство слышали про стейт-машину и на вопрос «а зачем же оно всё надо» ответят примерно следующим образом:
Чего? Я понимаю, что у нас всё всегда упаковывается в паттерны, а для всего уже придумали модные термины, но тут всё намного проще.
Запоминайте раз и навсегда, чтобы не умные термины учить, а понять 🌟.
В обычный метод поток заходит, делает какие-то дела и выходит — всё, после этого следов выполнения не осталось, а они и не нужны, ведь задача уже готова.
В асинхронный метод потоку НАДО УМЕТЬ зайти, прервать (уметь — не значит прервать, это уже от await зависит) выполнение в какой-то момент, выйти, а потом вернуться в то же место.
Зачем?
Например: мы в середине метода хотим сделать запрос к БД, который вернёт нам кучу строк и будет выполняться пару секунд.
Конечно, можно повисеть в середине метода и подождать, пока БД вернёт ответ, но это потоку надо прям висеть и ждать, а он не на помойке себя нашёл и может потратить это время более продуктивно.
А эта БД пусть сама скажет, когда закончит. Тогда какой-нибудь поток и отправим продолжать выполнение метода.
Всё. Вот для этого механизма и нужны стейт-машины, свитчи и мув некcты, которые под капотом это всё делают. Если нет понимания идеи, то знания про стейт машину бесполезны
У каждого спрашивали на собеседовании про модификатор async, большинство слышали про стейт-машину и на вопрос «а зачем же оно всё надо» ответят примерно следующим образом:
Ну… Это значит, что метод развернётся в стейт-машину, там свитч ещё будет, ну и метод вообще асинхронный, а это значит, ждать не будем.
Чего? Я понимаю, что у нас всё всегда упаковывается в паттерны, а для всего уже придумали модные термины, но тут всё намного проще.
Запоминайте раз и навсегда, чтобы не умные термины учить, а понять 🌟.
В обычный метод поток заходит, делает какие-то дела и выходит — всё, после этого следов выполнения не осталось, а они и не нужны, ведь задача уже готова.
В асинхронный метод потоку НАДО УМЕТЬ зайти, прервать (уметь — не значит прервать, это уже от await зависит) выполнение в какой-то момент, выйти, а потом вернуться в то же место.
Зачем?
Например: мы в середине метода хотим сделать запрос к БД, который вернёт нам кучу строк и будет выполняться пару секунд.
Конечно, можно повисеть в середине метода и подождать, пока БД вернёт ответ, но это потоку надо прям висеть и ждать, а он не на помойке себя нашёл и может потратить это время более продуктивно.
А эта БД пусть сама скажет, когда закончит. Тогда какой-нибудь поток и отправим продолжать выполнение метода.
За счёт этого во время асинхронной операции ввода-вывода (это как раз наш запрос к БД) не занят ни один поток приложения.
Всё. Вот для этого механизма и нужны стейт-машины, свитчи и мув некcты, которые под капотом это всё делают. Если нет понимания идеи, то знания про стейт машину бесполезны
- ❤ 22
- 👍 7
