Вместо вступления
Один из самых бесполезных вопросов, который можно встретить на собеседовании - "Чем отличается процесс от потока?".
Чем вопрос плох? Ответ на него гуглится очень быстро. Люди, читавшие книги на подобии Linux - Системное Программирование и Современные Операционные Системы ответ на него формируют долго. Дело в том, что не ясно, чего хочет услышать вопрошающий. Я, как человек, совершающий цикл собеседований раз в полгода-год - первые 2-3 собеседования заваливаю, чтобы понять как мне подстроится под текущее понимание процессов и потоков у вопрошающих. Чего они хотят на этот раз услышать от человека, который пары по операционным системам не прогуливал, но делал это очень давно?
In Real Life
Мне доводилось использовать в работе и процессы, и потоки, и конечно же асихронщину. Как правило сценарий в реальной работе выглядит следующим образом:
Эта штука работает час, при этом занято одно ядро из 16. Дай-ка я применю модуль multiprocessing. Хотя нет, граблей много - лучше сразу возьму loky.
Эта штука ничего не делает, но до неё не достучатся. Давайте применим threading.
Менеджер прочел статью о том, что threading это отстой, и сейчас повсюду асинхронщина. Давайте втащим asyncio или перепишем всё на go.
Issues
Счастье от ускоренного параллельным кодом длится не долго. Совсем. Приезжают следующие проблемы:
Кто-то подумал за нас и втащил в airflow multiprocessing. Это нормально. Но при неосторожном коде внутри dag - у нас плодятся zombie-процессы и под утро сервер скорее мертв, чем жив.
Стремление ускорить всё через threading приносит с собой счастье вроде GIL. И случайное поведение из-за каких-нибудь глобальных переменных - Threading local зачастую плохо гуглится из-за нежелания.
Код написанный в асинхронном стиле, внезапно, оказывается уязвим к утечкам памяти. А современные data science инструменты текут только так.
Вернемся к собеседованиям
Теперь давайте вернемся к собеседованиям. Чего хотят авторы вопросов про многопоточность и мультипроцессность обычно? На самом деле я не знаю.
Больше всего склоняюсь к мысли, что авторы спрашивают о том, что недавно узнали сами и это может быть что-то из следующего списка:
- Thread'ы провоцируют GIL. Но он же сейчас скажет про гринлеты!
- Multiprocessing из 20 процессов на 5 ядрах - это внезапно плохо, и переключение контекста жрет до хрена.
- Event loop течет.
- Если запустить 100500 go routine читать один файл с жесткого диска - внезапно станет очень плохо.
- Ах да, есть понятие thread safe и оно касается всего. От глобальных переменных до select for update в БД.
Нужны ли на самом деле вопросы про process vs thread на собеседовании? Как вы думаете?
Моё мнение приблизительно следующее. Я конечно спрошу человека про thread vs process, и мне лично будет достаточно услышать что потоки бегут внутри процесса, а процессы могут взаимодействовать через IPC.
При этом, я полностью осознаю глупость данного вопроса. Это один из немногих вопросов, которые можно отнести к "открытым", развить в дискуссию, но.. Только если дискуссия не случилась раньше, по более интересным вопросам.
Top comments (0)