Выбор ответа Middle GIL, потоки и процессы обновлено
Что нельзя передать в процесс
Вопрос
Почему ProcessPoolExecutor().map(lambda x: x * 2, data) падает?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Лямбду нельзя сериализовать pickle для другого процесса. Задачи передаются рабочим процессам через pickle, а pickle сохраняет функции по имени модуля и функции.
Варианты ответа
- Пул процессов не поддерживает
map, толькоsubmit - Лямбду нельзя сериализовать pickle для другого процессаправильный ответ
- Лямбды запрещены в многопоточном и многопроцессном коде
- Данные для пула процессов должны быть списком кортежей
Разбор
Задачи передаются рабочим процессам через pickle, а pickle сохраняет функции по имени модуля и функции. У лямбды и вложенных функций такого имени нет, поэтому сериализация не удаётся. Нужна функция верхнего уровня модуля. По той же причине нельзя передать открытое соединение или файл. С потоками лямбды работают, map у пула процессов есть.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.