> Как распараллелить обновление данных для миллиона пользователей за ограниченное время? (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: АФЛТСистемс

Стек: Python

> Пример ответа

Для обновления данных миллиона пользователей за ограниченное время в Python оптимально использовать комбинацию пула потоков (concurrent.futures.ThreadPoolExecutor) и пакетной обработки (batching). Основная идея - разбить пользователей на чанки (например, по 1000), каждый чанк обрабатывать в отдельном потоке, а внутри потока выполнять операции пачками (batch update) к базе данных или внешнему API.

Пример реализации:

PYTHON
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
def update_batch(user_ids):
# Эмуляция обновления пачки пользователей (например, SQL UPDATE ... WHERE id IN (...))
# В реальности - вызов БД или API с пачкой
time.sleep(0.1) # симуляция задержки
return len(user_ids)
def parallel_update(all_user_ids, batch_size=1000, max_workers=10):
# Разбиваем на чанки
chunks = [all_user_ids[i:i+batch_size] for i in range(0, len(all_user_ids), batch_size)]
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = {executor.submit(update_batch, chunk): chunk for chunk in chunks}
total_updated = 0
for future in as_completed(futures):
total_updated += future.result()
return total_updated
# Пример использования
users = list(range(1_000_000))
start = time.time()
updated = parallel_update(users, batch_size=1000, max_workers=20)
print(f"Обновлено {updated} пользователей за {time.time() - start:.2f} сек")

Ключевые моменты:

  • Размер чанка подбирается под пропускную способность БД/API (обычно 500-2000).
  • Количество потоков ограничивается I/O-возможностями (не CPU) - для сетевых запросов 20-50 потоков эффективны.
  • Обработка ошибок - добавьте retry-логику и логирование неудачных чанков.
  • Мониторинг прогресса - используйте tqdm или счетчики для отслеживания в реальном времени.

Для максимальной производительности рассмотрите асинхронный подход (asyncio + aiohttp/aiomysql), если ваша среда поддерживает event loop.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью