Выбор ответа Senior GIL, потоки и процессы обновлено
fork в многопоточной программе
Вопрос
Чем опасен fork процесса, в котором уже работают другие потоки?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В ребёнке только один поток, а чужие блокировки захвачены навсегда. После fork в ребёнке существует только один поток, но память копируется целиком, включая блокировки в состоянии «захвачено» потоками, которых в ребёнке нет.
Варианты ответа
- Ребёнок получает копии всех потоков и выполняет их работу дважды
- В ребёнке только один поток, а чужие блокировки захвачены навсегдаправильный ответ
- fork в Python запрещён при наличии потоков и бросает RuntimeError
- Все потоки родителя завершаются в момент вызова fork
Разбор
После fork в ребёнке существует только один поток, но память копируется целиком, включая блокировки в состоянии «захвачено» потоками, которых в ребёнке нет. Первое же обращение к такой блокировке (например, внутри logging) зависает навсегда. Поэтому с 3.12 Python предупреждает о fork в многопоточном процессе, а с 3.14 на POSIX по умолчанию используется forkserver. Потоки родителя продолжают работать в родителе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.