Получить доступ

Как пользоваться concurrent.futures и чем ThreadPoolExecutor отличается от ProcessPoolExecutor?

MiddleКонкурентность
Ещё спрашивают так:
  • Как распараллелить задачи в Python без ручного управления потоками?
Коротко

Единый интерфейс пулов: submit возвращает Future, map применяет функцию к итерируемому, as_completed отдаёт результаты по готовности. ThreadPoolExecutor — для ввода-вывода (GIL отпускается на ожидании), ProcessPoolExecutor — для вычислений (свой интерпретатор и GIL в каждом процессе).

  • Исключение задачи хранится в Future и бросается при result()
  • Процессам аргументы и результаты передаются через pickle — лямбды и открытые соединения не пройдут
  • with гарантирует shutdown и ожидание задач

А ещё max_workers по умолчанию: потоки — min(32, CPU + 4), процессы — число CPU

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Модель: пул рабочих, очередь задач, Future как дескриптор результата. submit(fn, *args) → Future; future.result(timeout) ждёт и возвращает значение или бросает исключение задачи.

map vs as_completed: pool.map возвращает результаты в порядке аргументов и бросает исключение при итерации на упавшем элементе; as_completed — по мере готовности, удобно для обработки ошибок по одной.

Потоки или процессы:

ThreadPoolExecutorProcessPoolExecutor
подходитввод-выводвычисления
GILобщийсвой в каждом процессе
накладные расходымалыезапуск процессов, pickle
общие данныеесть (нужны блокировки)нет

Подводные камни процессов: функции должны быть определены на уровне модуля (pickle), запуск под if __name__ == "__main__": (метод spawn на Windows и macOS), большие аргументы дорого сериализовать.

Пример

from concurrent.futures import ThreadPoolExecutor, as_completed

with ThreadPoolExecutor(max_workers=20) as pool:
    futures = {pool.submit(download, url): url for url in urls}
    for f in as_completed(futures):
        try:
            save(futures[f], f.result())
        except Exception as e:
            log.warning("%s: %s", futures[f], e)

Что хотят услышать

  • Интерфейс submit, map, as_completed, Future.
  • Выбор между потоками и процессами.
  • Ограничения pickle.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем