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

Пул процессов без if __name__ == "__main__"

Вопрос

Зачем при использовании multiprocessing на macOS и Windows код запуска пула кладут под if __name__ == "__main__":?

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

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

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

Коротко

Правильный ответ: spawn заново импортирует главный модуль и снова создаст пул. Метод spawn запускает новый интерпретатор, который импортирует модуль с функцией.

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

  1. Иначе дочерние процессы будут разделять один GIL с родителем
  2. Это нужно только для красоты кода и подсказок линтера
  3. Без этого процессы пула запускаются последовательно
  4. spawn заново импортирует главный модуль и снова создаст пулправильный ответ

Разбор

Метод spawn запускает новый интерпретатор, который импортирует модуль с функцией. Если создание пула лежит на верхнем уровне, импорт снова создаст пул, и Python остановит это с ошибкой о попытке запустить процесс до завершения инициализации. GIL у процессов и так свой, а на параллельность защита не влияет.

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

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