# Технология параллельного программирования (Python) Курс лабораторных работ для направления «Прикладная математика и информатика». ## Цель курса Научиться осознанно выбирать модель исполнения для конкретной задачи: | Модель | Когда помогает | Инструменты | |---|---|---| | Последовательный код | базовая линия | stdlib | | Потоки (threads) | задачи I/O-bound | `threading`, `concurrent.futures` | | Процессы (processes) | задачи CPU-bound | `multiprocessing` | | Асинхронность | много I/O-операций, кооперативность | `asyncio` | | Распределённые вычисления | несколько машин / узлов | `mpi4py` (MS-MPI) | Отдельное внимание: **GIL** — почему потоки в CPython не ускоряют чистый Python-код, и как это обходить. ## Состав работ | № | Папка | Тема | |---|---|---| | 0 | `lab00_intro/` | Окружение: Python, venv, VS Code, проверка готовности | | 1 | `lab01_sequential/` | Последовательное вычисление, профилирование, CPU-bound vs I/O-bound | | 2 | `lab02_threads/` | Многопоточность на I/O-bound задачах, `ThreadPoolExecutor` | | 3 | `lab03_gil/` | GIL: почему потоки не ускоряют CPU-код; `hashlib` как исключение | | 4 | `lab04_multiprocessing/` | Процессы, `Pool`, накладные расходы, spawn на Windows | | 5 | `lab05_sync/` | Гонки данных, `Lock`, `Semaphore`, `Event`, producer–consumer | | 6 | `lab06_asyncio/` | `async/await`, event loop, `gather`, семафор, сравнение с потоками | | 7 | `lab07_comparison/` | Одна задача × 4 подхода, закон Амдала, итоговые графики | | 8 | `lab08_mpi/` | Распределённые вычисления, MPI (по указанию преподавателя) | ## Варианты Каждый студент выполняет **свой вариант** — см. `common/варианты.md` (20 вариантов: CPU-задача + параметры + I/O-нагрузка). Ядра всех задач уже реализованы в `common/tasks.py` — смысл лабораторных именно в *организации вычислений и замерах*, а не в переписывании алгоритмов. ## Установка (Windows, 10/11) 1. Python 3.10+ с python.org (галочка **Add python.exe to PATH**). 2. Открыть папку курса в VS Code (расширение Python). 3. В терминале VS Code: ```bat python -m venv .venv .venv\Scripts\activate pip install -r requirements.txt python lab00_intro\check_env.py ``` Если вывод кириллицы «кракозябрами» — выполните `chcp 65001`. На macOS/Linux всё то же самое, кроме `activate` (там `source .venv/bin/activate`). ## Как сдавать - Код: `labXX_.../solution.py` (заполняются заготовки, интерфейсы менять нельзя — по ним работают автотесты). - Отчёт: по шаблону `common/шаблон_отчёта.md` — таблицы замеров, графики, выводы. - Самопроверка перед сдачей: `python -m pytest tests/ -k labXX` из корня курса. - Чек-лист: `common/чек-лист_сдачи.md`. Типичные ошибки: `common/типичные_ошибки.md`. ## Структура репозитория ``` common/ банк задач, варианты, утилиты замеров, шаблоны lab00_intro/ ... lab08_mpi/ методичка.md теория + задание + контрольные вопросы + критерии examples/ запускаемые демонстрации solution.py заготовка решения (заполняет студент) tests/ автотесты pytest (самопроверка студента, проверка преподавателя) instructor_solutions/ эталонные решения (только для преподавателя) ``` ## Запуск примеров и решений Все команды выполняются **из корня курса**: ```bat python lab01_sequential\examples\01_perf_counter_demo.py python lab01_sequential\solution.py python -m pytest tests\ -v ```