Sprint 51 — Многопоточность в Python (Junior)
Все задачи одного уровня.
⸻
TASK-J1 — Параллельная отправка уведомлений
Контекст
После крупной распродажи нужно отправить уведомления клиентам.
Сейчас отправка идет последовательно и занимает слишком много времени.
⸻
Данные
import time
users = [
"alex@mail.com",
"kate@mail.com",
"john@mail.com",
"max@mail.com",
"anna@mail.com"
]
def send_email(email):
time.sleep(1)
print(f"Sent: {email}")
⸻
Требования
Запустить отправку писем в отдельных потоках.
⸻
Ожидаемый результат
Вместо ~5 секунд программа должна завершаться примерно за ~1 секунду.
⸻
Что проверяется
- threading.Thread
- start()
- join()
⸻
TASK-J2 — Параллельная обработка заказов
Контекст
Каждый заказ обрабатывается независимо.
⸻
Данные
import time
orders = [1001, 1002, 1003, 1004, 1005]
def process_order(order_id):
time.sleep(2)
print(f"Processed {order_id}")
⸻
Требования
Запустить обработку каждого заказа в отдельном потоке.
После завершения всех потоков вывести:
print("All orders processed")
⸻
Что проверяется
- Создание множества потоков
- Ожидание завершения
⸻
TASK-J3 — Мониторинг серверов
Контекст
Есть список серверов.
Проверка каждого занимает 1 секунду.
⸻
Данные
servers = [
"server-1",
"server-2",
"server-3",
"server-4"
]
import time
def ping(server):
time.sleep(1)
print(f"{server}: OK")
⸻
Требования
Выполнить проверку всех серверов одновременно.
Собрать результаты в общий список.
⸻
Что проверяется
- Потоки
- Работа с общим объектом
⸻
Sprint 51 — Многопоточность в Python (Middle)
⸻
TASK-M1 — Потокобезопасный счетчик заказов
Контекст
На маркетплейсе несколько потоков одновременно регистрируют новые заказы.
Иногда итоговое количество заказов получается неправильным.
⸻
Данные
orders_count = 0
def create_order():
global orders_count
for _ in range(100_000):
orders_count += 1
⸻
Требования
Запустить 10 потоков.
Итоговое значение должно быть:
1_000_000
⸻
Ограничение
Использовать:
threading.Lock
⸻
Что проверяется
- Race Condition
- Mutex
- Критическая секция
⸻
TASK-M2 — Очередь задач поддержки
Контекст
Пользователи создают тикеты.
Операторы обрабатывают их параллельно.
⸻
Данные
tickets = [
"ticket-1",
"ticket-2",
"ticket-3",
"ticket-4",
"ticket-5",
"ticket-6",
]
⸻
Требования
Реализовать схему:
- Producer кладет тикеты в очередь.
- 3 Worker-потока забирают тикеты.
- После обработки выводят:
Processed ticket-4
⸻
Ограничение
Использовать:
queue.Queue
⸻
Что проверяется
- Producer / Consumer
- Thread-safe очередь
⸻
TASK-M3 — Пул потоков для генерации отчетов
Контекст
Каждый отчет строится независимо.
⸻
Данные
reports = [
101, 102, 103, 104,
105, 106, 107, 108
]
def build_report(report_id):
...
⸻
Требования
Использовать:
concurrent.futures.ThreadPoolExecutor
Запускать не более:
max_workers=3
⸻
Результат
Собрать все результаты в список.
⸻
Что проверяется
- ThreadPoolExecutor
- futures
- map / submit
⸻
Sprint 51 — Многопоточность в Python (Senior)
⸻
TASK-S1 — Банковские переводы между счетами
Контекст
В системе одновременно выполняются переводы.
Иногда деньги “теряются”.
⸻
Данные
accounts = {
"A": 10000,
"B": 5000
}
⸻
Функция
def transfer(from_acc, to_acc, amount):
...
⸻
Требования
- Запустить десятки переводов параллельно.
- Исключить потерю денег.
- После завершения:
sum(accounts.values())
должна совпадать с исходной суммой.
⸻
Ограничение
Использовать блокировки.
⸻
Что проверяется
- Deadlock awareness
- Lock ordering
- Атомарность операций
⸻
TASK-S2 — Система бронирования билетов
Контекст
На концерт осталось 100 билетов.
Одновременно приходят тысячи запросов.
⸻
Данные
tickets = 100
⸻
Требования
Реализовать функцию:
book_ticket(user_id)
которая:
- уменьшает количество билетов;
- не продает один билет дважды;
- корректно работает при 1000+ потоках.
⸻
Ожидаемый результат
Продано ровно:
100
билетов.
⸻
Что проверяется
- Race Condition
- Synchronization
- Lock
⸻
TASK-S3 — Реализация собственного Thread Pool
Контекст
Команда хочет понять внутреннее устройство ThreadPoolExecutor.
⸻
Требования
Реализовать класс:
class ThreadPool:
...
⸻
Поддержка
pool.submit(task)
pool.shutdown()
⸻
Внутри использовать
threading.Thread
queue.Queue
⸻
Поведение
pool = ThreadPool(workers=4)
pool.submit(task1)
pool.submit(task2)
pool.submit(task3)
pool.shutdown()
Все задачи должны гарантированно выполниться.
⸻
Что проверяется
- Архитектура многопоточных приложений
- Worker Threads
- Очереди
- Graceful Shutdown
- Координация потоков
- Практическое понимание устройства ThreadPoolExecutor изнутри