Init
This commit is contained in:
commit
c394677d07
59 files changed
+5149
No files matched your search
@@ -0,0 +1,116 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Лабораторная 0: проверка готовности окружения.
|
||||
|
||||
Запуск из корня курса:
|
||||
python lab00_intro/check_env.py
|
||||
|
||||
Скрипт проверяет версию Python, библиотеки, число ядер и работоспособность
|
||||
threading / multiprocessing / asyncio. Все проверки должны напечатать [OK].
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
|
||||
# делаем доступным импорт common.* при запуске из корня курса
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
||||
|
||||
FAILED = []
|
||||
|
||||
|
||||
def check(name: str, fn):
|
||||
try:
|
||||
detail = fn()
|
||||
print(f"[OK] {name}{(': ' + str(detail)) if detail else ''}")
|
||||
except Exception as e: # noqa: BLE001
|
||||
FAILED.append(name)
|
||||
print(f"[FAIL] {name}: {type(e).__name__}: {e}")
|
||||
|
||||
|
||||
def check_python_version():
|
||||
v = sys.version_info
|
||||
assert v >= (3, 10), f"нужен Python 3.10+, у вас {v.major}.{v.minor}"
|
||||
return f"Python {v.major}.{v.minor}.{v.micro}"
|
||||
|
||||
|
||||
def check_modules():
|
||||
import numpy
|
||||
import matplotlib
|
||||
import pytest
|
||||
return (f"numpy {numpy.__version__}, matplotlib {matplotlib.__version__}, "
|
||||
f"pytest {pytest.__version__}")
|
||||
|
||||
|
||||
def check_cpu_count():
|
||||
import multiprocessing
|
||||
n = multiprocessing.cpu_count()
|
||||
assert n >= 2, "нужно минимум 2 логических ядра"
|
||||
return f"{n} логических ядер"
|
||||
|
||||
|
||||
def check_threading():
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
|
||||
results = []
|
||||
with ThreadPoolExecutor(max_workers=4) as pool:
|
||||
results = list(pool.map(lambda x: x * x, range(8)))
|
||||
assert results == [i * i for i in range(8)]
|
||||
return "ThreadPoolExecutor работает"
|
||||
|
||||
|
||||
def _double(x):
|
||||
"""Функция модульного уровня — Pool требует пиккелируемость."""
|
||||
return x * 2
|
||||
|
||||
|
||||
def check_multiprocessing():
|
||||
import multiprocessing
|
||||
|
||||
ctx = multiprocessing.get_context() # spawn на Windows, fork на macOS/Linux
|
||||
with ctx.Pool(2) as pool:
|
||||
res = pool.map(_double, [1, 2, 3, 4])
|
||||
assert res == [2, 4, 6, 8], res
|
||||
return f"метод запуска: {ctx.get_start_method()}"
|
||||
|
||||
|
||||
def check_asyncio():
|
||||
import asyncio
|
||||
|
||||
async def main():
|
||||
await asyncio.sleep(0.01)
|
||||
return 42
|
||||
|
||||
assert asyncio.run(main()) == 42
|
||||
return "event loop работает"
|
||||
|
||||
|
||||
def check_common_tasks():
|
||||
from common.tasks import get_variant
|
||||
|
||||
v = get_variant(1)
|
||||
assert "task_name" in v and "io" in v
|
||||
return f"вариант 1: {v['describe']}"
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 60)
|
||||
print("Проверка окружения для курса «Технология параллельного программирования»")
|
||||
print("=" * 60)
|
||||
check("Версия Python", check_python_version)
|
||||
check("Библиотеки", check_modules)
|
||||
check("Число ядер CPU", check_cpu_count)
|
||||
check("Потоки (threading)", check_threading)
|
||||
check("Процессы (multiprocessing)", check_multiprocessing)
|
||||
check("Асинхронность (asyncio)", check_asyncio)
|
||||
check("Банк задач (common.tasks)", check_common_tasks)
|
||||
print("-" * 60)
|
||||
if FAILED:
|
||||
print(f"ПРОБЛЕМЫ: {', '.join(FAILED)}")
|
||||
print("Разберитесь по методичке lab00_intro/методичка.md — без этого")
|
||||
print("следующие лабораторные не будут работать.")
|
||||
sys.exit(1)
|
||||
print("Всё готово. Запомните свой вариант из common/варианты.md.")
|
||||
if os.name == "nt":
|
||||
print("(Кириллица отображается кракозябрами? Выполните: chcp 65001)")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,111 @@
|
||||
# Лабораторная работа 0. Подготовка окружения
|
||||
|
||||
**Время на работу:** 1 пара. **Оценка:** зачёт/не зачёт.
|
||||
|
||||
## Цель работы
|
||||
|
||||
Подготовить рабочее окружение и убедиться, что все механизмы параллельного
|
||||
программирования доступны на вашей машине — до того, как вы начнёте основную
|
||||
лабораторную.
|
||||
|
||||
## Теория (минимум)
|
||||
|
||||
### Виртуальное окружение (venv)
|
||||
|
||||
Виртуальное окружение — изолированная папка с собственной копией Python и
|
||||
своим набором библиотек. Оно нужно, чтобы зависимости курса не конфликтовали
|
||||
с другими проектами. Активированное окружение видно в терминале по префиксу
|
||||
`(.venv)`.
|
||||
|
||||
### Почему не Google Colab / онлайн-интерпретаторы
|
||||
|
||||
Параллельность — это про реальные ядра CPU и реальную ОС. В облаке вы не
|
||||
получите ни честного числа ядер, ни контроля над фоновыми процессами, ни
|
||||
Windows-специфики `spawn`. Работаем локально.
|
||||
|
||||
### Модель памяти Python: всё передаётся по ссылке
|
||||
|
||||
В Python переменные — ссылки на объекты. Для потоков это значит: **все потоки
|
||||
одного процесса видят одни и те же объекты** — отсюда гонки данных (лаба 5).
|
||||
Для процессов это значит: **каждый процесс получает свою копию данных**
|
||||
(через pickle) — отсюда накладные расходы (лаба 4).
|
||||
|
||||
## Задание
|
||||
|
||||
### Шаг 1. Установите Python 3.10+
|
||||
|
||||
Windows: python.org → Downloads → «Windows installer (64-bit)».
|
||||
**Обязательно** отметьте «Add python.exe to PATH» на первом экране установщика.
|
||||
|
||||
Проверка (новое окно терминала):
|
||||
|
||||
```bat
|
||||
python --version
|
||||
```
|
||||
|
||||
### Шаг 2. VS Code
|
||||
|
||||
Установите VS Code и расширение **Python** (издатель Microsoft). Откройте
|
||||
папку курса: File → Open Folder. Терминал: Terminal → New Terminal
|
||||
(или `` Ctrl+` ``).
|
||||
|
||||
### Шаг 3. Виртуальное окружение и зависимости
|
||||
|
||||
В терминале VS Code **из корня курса**:
|
||||
|
||||
```bat
|
||||
python -m venv .venv
|
||||
.venv\Scripts\activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
macOS/Linux: `source .venv/bin/activate`.
|
||||
|
||||
Если VS Code спросит интерпретатор — выберите `.\.venv\Scripts\python.exe`.
|
||||
|
||||
### Шаг 4. Git (кратко, если ещё не знакомы)
|
||||
|
||||
```bat
|
||||
git init
|
||||
git add .
|
||||
git commit -m "lab 0: окружение готово"
|
||||
```
|
||||
|
||||
Дальше фиксируйте прогресс коммитами — это история вашей работы (и аргумент
|
||||
в спорах о списывании).
|
||||
|
||||
### Шаг 5. Проверка окружения
|
||||
|
||||
```bat
|
||||
python lab00_intro\check_env.py
|
||||
```
|
||||
|
||||
Скрипт проверит версию Python, наличие библиотек, число ядер CPU и работоспособность
|
||||
потоков, процессов и asyncio. Все проверки должны быть `[OK]`.
|
||||
|
||||
### Шаг 6. Свой вариант
|
||||
|
||||
```python
|
||||
from common.tasks import get_variant
|
||||
print(get_variant(<ваш номер в журнале>))
|
||||
```
|
||||
|
||||
Запишите параметры — они понадобятся во всех следующих лабораторных.
|
||||
|
||||
## Контрольные вопросы
|
||||
|
||||
1. Зачем нужно виртуальное окружение? Что произойдёт, если его не создавать?
|
||||
2. Чем процесс отличается от потока? (Подсказка: общая память.)
|
||||
3. Почему для этого курса важна работа на локальной машине, а не в облаке?
|
||||
|
||||
## Что сдаётся
|
||||
|
||||
- Скриншот вывода `check_env.py` (все проверки `[OK]`);
|
||||
- короткий ответ на контрольные вопросы (можно в чате при сдаче).
|
||||
|
||||
## Критерии зачёта
|
||||
|
||||
| Пункт | Баллы |
|
||||
|---|---|
|
||||
| Окружение развёрнуто, check_env.py всё `[OK]` | 1 |
|
||||
| Ответы на контрольные вопросы | 1 |
|
||||
Reference in new issue
Block a user