ДЗ 4 — Многозадачность и синхронизация
📚 Лекция: Концепции многозадачности
Тема курса: модуль 5 (концепции многозадачности) Дедлайн: 23 апреля 2026, 23:59 Classroom: Принять задание
4.1 — Сравнение подходов к параллелизму (2 балла) ★★☆
Реализуй вычисление чисел Фибоначчи (fib(35) × 8 чисел) четырьмя способами и сравни время выполнения:
threading.Threadmultiprocessing.Poolconcurrent.futures.ProcessPoolExecutorinterpreters(субинтерпретаторы, Python 3.12+)
Требования:
- Замер времени для каждого подхода, вывод таблицы сравнения
- В комментарии к коду объясни: почему
threadingне даёт ускорения для CPU-bound задачи, что такое GIL и как субинтерпретаторы меняют ситуацию в 3.12–3.14
Метод Время (сек) Ускорение
Sequential 8.42 1.0×
threading.Thread 8.39 1.0× ← почему?
multiprocessing.Pool 2.31 3.6×
concurrent.futures 2.28 3.7×
interpreters 2.45 3.4×
GIL — одна из самых обсуждаемых особенностей Python. Нужно не просто знать что он есть, а уметь показать его влияние на конкретных числах.
4.2 — Параллельное интегрирование (2 балла) ★★☆
Реализуй вычисление определённого интеграла методом Монте-Карло (о ценка π).
- Последовательная версия
- Параллельная версия через
ProcessPoolExecutor - Сравни точность и время при разном
n_samples(10⁵, 10⁶, 10⁷)
Требование: параллельная версия должна давать корректный результат и быть быстрее при n_samples >= 10⁶.
4.3 — Многопоточный логгер с ротацией (2 балла) ★★☆
Реализуй ThreadedLogger — логгер с несколькими потоками-producers и одним потоком-consumer.
Поведение:
- N потоков-producers генерируют лог-сообщения с уникальным ID
- 1 поток-consumer записывает их в файл
- При достижении
max_linesфайл ротируется (переименовывается, создаётся новый) - Поддерживает graceful shutdown через
stop()
Твой вариант определяет набор примитивов синхронизации:
| # | Примитивы |
|---|---|
| 0 | Lock + Event + Barrier |
| 1 | Semaphore + Condition + Event |
| 2 | RLock + Queue + Event |
Проверка корректности: в финальных лог-файлах не должно быть пропущенных или дублированных сообщений (тест проверяет по ID).
Бонус: продемонстрируй race condition — убери синхронизацию и покажи что появляются дубли или пропуски. Добавь в STUDENT.md объяснение почему это происходит.
Примитивы синхронизации — то, что отличает корректный многопоточный код от кода, который «обычно работает». Race condition легко допустить и сложно поймать.
Итого
| Задача | Баллы |
|---|---|
| 4.1 Сравнение 4 подходов + объяснение GIL | 2 |
| 4.2 Параллельный Монте-Карло | 2 |
| 4.3 ThreadedLogger с примитивами синхронизации | 2 |
| Итого | 6 |