Асинхронный Python

Урок 2 — Сквозь мусор к звёздам

Подготовлено онлайн-курсом

https://dvmn.org

Перейдите к следующему слайду, нажав кнопку Вправо

fly_garbage

перемещает фрагмент мусора

корутина

#1A. Наполнить орбиту мусором

fill_orbit_with_garbage

event loop

бесконечный цикл по корутинам

фрагмент мусора

вылетел за край поля

заказ на еще одну корутину

пауза

пауза . . .

наполняет орбиту мусором

корутина

пауза

время

запустить

запустить

fly_garbage

перемещает фрагмент мусора

корутина

#1B. Наполнить орбиту мусором

fill_orbit_with_garbage

event loop

бесконечный цикл по корутинам

мусор вылетел
за край поля

добавить корутину

наполняет орбиту мусором

корутина

время

1

2

3

await sleep

await sleep

4

5

6

7

9

8

10

await sleep

await sleep

Цифрами 1, 2 - 10 указана последовательность запуска корутин

Очередность указана не точно и может варьироваться

await sleep

добавить корутину

добавить корутину

запутить

запутить

run_spaceship

считывает нажатия клавиш, вызывает read_controls

рассчитывает новые координаты

рисует кадр анимации — вызывает draw_frame

корутина

#2A. Синхронное движение и анимация

animate_spaceship

записывает текущий кадр анимации — строку в переменную spaceship_frame

корутина

spaceship_frame

запись следующего кадра

чтение текущего кадра анимации

глобальная переменная
хранит строку — текущий кадр анимации

На каждый из объектов в игре: звезду или выстрел — приходится по одной корутине. Но у корабля их будет сразу две, работают они параллельно и общаются друг с другом через глобальную переменную spaceship_frame.

время

run_spaceship

считывает нажатия клавиш — вызывает read_controls

обновляет координаты корабля

рисует корабль — вызывает draw_frame

корутина

#2B. Синхронное движение и анимация

animate_spaceship

записывает текущий кадр анимации — строку в переменную spaceship_frame

корутина

spaceship_frame

запись следующего кадра

чтение текущего кадра анимации

глобальная переменная
хранит строку — следующий кадр анимации

На каждый из объектов в игре: звезду или выстрел — приходится по одной корутине. Но у корабля их будет сразу две, работают они параллельно и общаются друг с другом через глобальную переменную spaceship_frame.

время

2

await sleep

Цифрами 1, 2 - 7 указана последовательность запуска корутин

Очередность указана не точно и может варьироваться

await sleep

await sleep

3

4

6

5

кадр #1

кадр #2

кадр #1

1

чтение текущего кадра анимации

7

await sleep

draw_frame

draw_frame

draw_frame

fly_garbage

#3. Отследить положение мусора

fly_garbage

show_obstacles

obstacles

глобальная переменная
список всех препятствий на игровом поле

корутина

делает препятствия видимыми — рисует на экране их границу в виде рамки
корутина

корутина

обновление координат

чтение координат

draw_frame

draw_frame

draw_frame

#4. Прервать полёт мусора

obstacles

глобальная переменная

список препятствий задетых выстрелами

глобальная переменная
список всех препятствий

выстрел
попал в препятствие

фрагмент мусора
уничтожен

obstacles_in_last_collisions

fly_garbage

проверяет было ли попадание

корутина

fire

проверяет было ли столкновение

корутина

сообщаем о столкновении с препятсвием

список новых
столкновений

координаты
препятствий

Попадание?
Нет

Попадание?
Нет

Попадание?
Нет

Есть
попадание!

Столкновение?
Нет

Столкновение?
Нет

Есть
столкновение!