Форум сайта python.su
А то я не понимаю для чего они используются
Офлайн
Раньше вот электронная почта была на Яндексе или на Mail.ru. Чтобы узнать (когда смотришь через браузер на ящик), пришло ли новое письмо, нужно было нажать на кнопку “обновить” в браузере или на кнопку “проверить ящик” в самом ящике. Тогда вся страница перезагружалась и там было видно, что есть новое письмо и уже давно пришло. Пока этого не сделаешь, всё будет выглядеть так, будто новых писем нет. Но потом со временем всё изменилось. Стало так, что ты сидишь в ящике и тут раз и тебе начинает просто показывать, что в ящике есть новое письмо. При этом ничего не надо нажимать, оно просто приходит. Это произошло тогда, когда пришла технология AJAX (Asynchronous Javascript and XML) , которая дала возможность наладить общение между браузером и сервером, которое не видно для пользователя. Таким образом, браузер через каждые пять секунд делает запрос на сервере “у тебя есть новая почта?”, а сервер ему отвечает “нет”. Потом через пять секунд он опять у него спрашивает “у тебя есть новая почта?”, сервер говорит ему “да”. Тогда браузер говорит ему “дай мне новую почту”, сервер ему даёт заголовки. Браузер считает эти заголовки и меняет на странице лишь один элемент. И ты видишь вдруг на экране “у вас 2 новых сообщения”, хотя страница не перезагружалась.
Так вот, если ты пишешь что-то на питоне и тебе надо, чтобы ничего не ждало никаких нажатий и действий пользователя, чтобы сделать следующий шаг какой-то, то ты используешь асинхронную модель. Если же тебе всё равно, то ты используешь синхронную модель. Тогда пользователю сначала скажут “нажми цифру один” и будут ждать, пока он её не нажмёт.
Отредактировано py.user.next (Июль 20, 2021 09:34:05)
Офлайн
liriK
Смотри, вот твоя программа, это некоторое количество строк синтаксически осмысленного кода, который компьютер может выполнить. В самом обычном “классическом” программировании мы подразумеваем, что строки кода выполняются строго последовательно. Конечно, у нас есть ветвления, циклы и переходы, но ты всегда можешь зная состояние переменных сказать, какая строка кода будет выполнена следующей. Все это выглядит логично, пока твоя программа не станет получать каких-то данных из вне. Например из базы данных. База данных находится на другой машине, и запрос данных занимает некое непредсказуемое время. Если наша программа такая как я написал выше, то в период запроса она будет не делать ничего, просто ждать. Хотя на самом деле это “ожидание” вовсе не означает простой процессора, где-то там будет крутиться цикл, который будет непрерывно проверять не пришли ли данные с ответом и точно так же расходовать энергию, как и любые вычисления вообще. Процессору, вообще пофиг. Смысл асинхронщины - занять процессор полезной работой, вместо гоняния пустого цикла. Вот, например, мы пишем веб-сайт. Предположим, что у нас на сервере один процессор с одним ядром. Это значит, что в конкретный момент времени мы можем обрабатывать один конкретный пользовательский запрос по какой-то ссылке, а если к нам приходит одновременно несколько запросов от нескольких пользователей, то запросы будут копиться в очереди. А что обычно вообще делает бэкенд сайта? Получает запрос по УРЛу, формирует на основании его запрос к БД, получает данные от БД, формирует ответ и возвращает его клиенту. Так вот, пока мы ждем ответ от БД, мы можем начать работать с другим запросом из очереди, а не тупо ждать. Вот для этого и нужны await, это место в программе, где мы временно прерываем выволнение функции (потому что здесь функция ждет ответа из вне) и выполняем другую функцию, которая, например, уже дождалась ответа и мы должны продолжить её выполнение с того момента, где её прервали await-ом
Отредактировано FishHook (Июль 20, 2021 16:29:55)
Офлайн