Выбор ответа Middle GIL, потоки и процессы обновлено

Что нельзя передать в процесс

Вопрос

Почему ProcessPoolExecutor().map(lambda x: x * 2, data) падает?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Лямбду нельзя сериализовать pickle для другого процесса. Задачи передаются рабочим процессам через pickle, а pickle сохраняет функции по имени модуля и функции.

Варианты ответа

  1. Пул процессов не поддерживает map, только submit
  2. Лямбду нельзя сериализовать pickle для другого процессаправильный ответ
  3. Лямбды запрещены в многопоточном и многопроцессном коде
  4. Данные для пула процессов должны быть списком кортежей

Разбор

Задачи передаются рабочим процессам через pickle, а pickle сохраняет функции по имени модуля и функции. У лямбды и вложенных функций такого имени нет, поэтому сериализация не удаётся. Нужна функция верхнего уровня модуля. По той же причине нельзя передать открытое соединение или файл. С потоками лямбды работают, map у пула процессов есть.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.