Перейти к основному содержимому

ДЗ 4 — Многозадачность и синхронизация

📚 Лекция: Концепции многозадачности

Тема и дедлайн

Тема курса: модуль 5 (концепции многозадачности) Дедлайн: 23 апреля 2026, 23:59 Classroom: Принять задание


4.1 — Сравнение подходов к параллелизму (2 балла) ★★☆

Реализуй вычисление чисел Фибоначчи (fib(35) × 8 чисел) четырьмя способами и сравни время выполнения:

  1. threading.Thread
  2. multiprocessing.Pool
  3. concurrent.futures.ProcessPoolExecutor
  4. interpreters (субинтерпретаторы, 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()

Твой вариант определяет набор примитивов синхронизации:

#Примитивы
0Lock + Event + Barrier
1Semaphore + Condition + Event
2RLock + Queue + Event

Проверка корректности: в финальных лог-файлах не должно быть пропущенных или дублированных сообщений (тест проверяет по ID).

Бонус: продемонстрируй race condition — убери синхронизацию и покажи что появляются дубли или пропуски. Добавь в STUDENT.md объяснение почему это происходит.

Зачем это

Примитивы синхронизации — то, что отличает корректный многопоточный код от кода, который «обычно работает». Race condition легко допустить и сложно поймать.


Итого

ЗадачаБаллы
4.1 Сравнение 4 подходов + объяснение GIL2
4.2 Параллельный Монте-Карло2
4.3 ThreadedLogger с примитивами синхронизации2
Итого6