Различия между версиями 2 и 3
Версия 2 от 2020-12-08 12:31:05
Размер: 2775
Редактор: FrBrGeorge
Комментарий:
Версия 3 от 2020-12-08 12:47:49
Размер: 3617
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 15: Строка 15:
 
Ещё модели:
 * Цикл событий: получает ''откуда-то'' «события», после чего некоторые сегменты кода (которые ждут этого события) можно «разбудить»
  * Цикл обратных вызовов: примерно то же самое
 * Цикл с future:
  * future — это асинхронный код из двух сегментов (зашёл - выпал в mainloop - вернул результат) + поле готовности
  * Один код спит на ней
  * Другой код заполняет результат и выставляет готовность
  * mainloop проверяет готовность, и если она есть — передаёт управление
 * …

Асинхронные возможности Python

Асинхронность:

  • Явная (параллелизм) — в языке нет
  • Со скрытой активацией (обратные вызовы, callbacks) — всё зависит от mainloop
  • Сопрограммная — вот!

Модель

  • Как работает yield from

  • Ловля return из генератора с помощью yield from

  • Асинхронность как произвольное исполнение сегментов кода между yield-ами

    • Понятие образующего цикла (main loop)
    • Передача управления в main loop с помощью явного yield

    • Обмен данными с сегментами сопрограмм с помощью .send()

Ещё модели:

  • Цикл событий: получает откуда-то «события», после чего некоторые сегменты кода (которые ждут этого события) можно «разбудить»

    • Цикл обратных вызовов: примерно то же самое
  • Цикл с future:
    • future — это асинхронный код из двух сегментов (зашёл - выпал в mainloop - вернул результат) + поле готовности
    • Один код спит на ней
    • Другой код заполняет результат и выставляет готовность
    • mainloop проверяет готовность, и если она есть — передаёт управление

Async

  • async def ~== генератор

  • yield from ~== await

  • @types.coroutine — чтобы и yield и return (не доделали ещё?)

    • async def + yield — совсем другое, это именно то, чем кажется, специальные асинхронные генераторы, которые можно проходить async for (причём в конструкторах вида [… async for i in асинхронный-гененратор …] тоже)

Самое сложное — это логика образующего цикла.

Asyncio

  • Самое сложное — это логика образующего цикла
  • Самое ненужное — это логика образующего цикла (достаточно знать, как он работает, а не что делает)

  • Запрограммируем образующий цикл заранее, насуём туда инструментов
  • Упростим протокол управления до одного понятия — future

  • (asyncio specific) обмажем огромным количеством применений IRL

Основные понятия:

  • Manloop
  • Task
  • Future

И толстый-толстый слой шоколада!

  • Параллелизм (внешний, следите за тредобезопасностью или не используйте треды)
  • Очереди (всякие)
  • Сеть (I/O, IPC и всё остальное), сигналы
  • Потоки (над этим всем)
  • Модификация образующего цикла
  • Вброс/перехват исключений

Д/З

Задач на EJudge нет.

TODO

LecturesCMC/PythonIntro2020/14_Async (последним исправлял пользователь FrBrGeorge 2020-12-10 15:26:51)