2775
Комментарий:
|
3617
|
Удаления помечены так. | Добавления помечены так. |
Строка 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