Files
2026-10-07 13:06:47 +05:00

87 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Технология параллельного программирования (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
```