MiddleКодИногдаЕщё не отвечали
Распараллельте CPU-задачу через пул процессов
Вычислите квадраты 0..9 в нескольких процессах (настоящий CPU-параллелизм).
Требования:
- Использовать пул процессов, чтобы работа обходила GIL.
- Собрать результаты в список в порядке входа.
from concurrent.futures import ProcessPoolExecutor
def square(n):
return n * n
# ваш код здесь: примените square к range(10) по процессам
Допишите реализацию.
Используйте ProcessPoolExecutor, чтобы обойти GIL: with ProcessPoolExecutor() as pool: results = list(pool.map(square, range(10))). У каждого процесса свой интерпретатор и GIL, поэтому работа идёт по-настоящему параллельно. Функция и аргументы должны быть picklable.
- ✗Использовать потоки для CPU-нагрузки (GIL блокирует параллелизм)
- ✗Передавать через процессы non-picklable функцию или аргумент
- ✗Подавать весь итерируемый объект одним аргументом вместо map по элементам
- →Почему функция и аргументы должны быть picklable для
ProcessPoolExecutor? - →Когда
ThreadPoolExecutor— правильный выбор вместоProcessPoolExecutor?
Оглавление
Задача
Вычислите квадраты чисел 0..9 параллельно в нескольких процессах, обходя GIL.
Решение
from concurrent.futures import ProcessPoolExecutor
def square(n):
return n * n
if __name__ == "__main__":
with ProcessPoolExecutor() as pool:
results = list(pool.map(square, range(10)))
print(results) # [0, 1, 4, 9, ..., 81], посчитано по процессам
Ключевые моменты
ProcessPoolExecutorдаёт каждому процессу свой интерпретатор и GIL — настоящий CPU-параллелизм.pool.mapсохраняет порядок входа в результатах.- Функция и аргументы должны быть picklable; для I/O-задач выбирайте
ThreadPoolExecutor.
Оглавление