Что в процессе тебе моем?
Tags: python, go, threading, asyncio
Published: 2021-02-18 09:05:50

## Вместо вступления 

Один из самых бесполезных вопросов, который можно встретить на собеседовании - "Чем отличается процесс от потока?". 

Чем вопрос плох? Ответ на него [гуглится](https://stackoverflow.com/questions/200469/what-is-the-difference-between-a-process-and-a-thread) очень быстро. Люди, читавшие книги на подобии [Linux - Системное Программирование](https://www.ozon.ru/context/detail/id/26420096/) и [Современные Операционные Системы](https://www.ozon.ru/context/detail/id/31649356/) ответ на него формируют долго. Дело в том, что не ясно, чего хочет услышать вопрошающий. Я, как человек, совершающий цикл собеседований раз в полгода-год - первые 2-3 собеседования заваливаю, чтобы понять как мне подстроится под текущее понимание процессов и потоков у вопрошающих. Чего они хотят на этот раз услышать от человека, который пары по операционным системам не прогуливал, но делал это очень давно? 

## In Real Life 

Мне доводилось использовать в работе и процессы, и потоки, и конечно же асихронщину. Как правило сценарий в реальной работе выглядит следующим образом: 

- Эта штука работает час, при этом занято одно ядро из 16. Дай-ка я применю модуль [multiprocessing](https://docs.python.org/3/library/multiprocessing.html). Хотя нет, граблей много - лучше сразу возьму [loky](https://loky.readthedocs.io/en/stable/).

- Эта штука ничего не делает, но до неё не достучатся. Давайте применим [threading](https://docs.python.org/3/library/threading.html). 

- Менеджер прочел статью о том, что threading это отстой, и сейчас повсюду асинхронщина. Давайте втащим [asyncio](https://docs.python.org/3/library/asyncio.html) или перепишем всё на go. 

## Issues 

Счастье от ускоренного параллельным кодом длится не долго. Совсем. Приезжают следующие проблемы: 

- Кто-то подумал за нас и втащил в airflow multiprocessing. Это нормально. Но при неосторожном коде внутри dag - у нас плодятся [zombie-процессы](https://linuxreviews.org/Defunct_process) и под утро сервер скорее мертв, чем жив. 

- Стремление ускорить всё через threading приносит с собой счастье вроде [GIL](http://www.dabeaz.com/GIL/gilvis/index.html). И случайное поведение из-за каких-нибудь глобальных переменных - [Threading local](https://stackoverflow.com/questions/1408171/thread-local-storage-in-python#13240093) зачастую плохо гуглится из-за нежелания. 

- Код написанный в асинхронном стиле, внезапно, оказывается уязвим к утечкам памяти. А современные data science инструменты текут только так. 

## Вернемся к собеседованиям 

Теперь давайте вернемся к собеседованиям. Чего хотят авторы вопросов про многопоточность и мультипроцессность обычно? На самом деле я не знаю. 

Больше всего склоняюсь к мысли, что авторы спрашивают о том, что недавно узнали сами и это может быть что-то из следующего списка: 

* Thread'ы провоцируют GIL. Но он же сейчас скажет про [гринлеты](https://vovkd.github.io/gevent-tutorial/)! 
* Multiprocessing из 20 процессов на 5 ядрах - это внезапно плохо, и переключение контекста жрет до хрена. 
* Event loop течет. 
* Если запустить 100500 go routine читать один файл с жесткого диска - внезапно станет очень плохо. 
* Ах да, есть понятие thread safe и оно касается всего. От глобальных переменных до select for update в БД. 

Нужны ли на самом деле вопросы про process vs thread на собеседовании? Как вы думаете? 

Моё мнение приблизительно следующее. Я конечно спрошу человека про thread vs process, и мне лично будет достаточно услышать что потоки бегут внутри процесса, а процессы могут взаимодействовать через [IPC](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BD%D0%BE%D0%B5_%D0%B2%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5). 

При этом, я полностью осознаю глупость данного вопроса. Это один из немногих вопросов, которые можно отнести к "открытым", развить в дискуссию, но.. Только если дискуссия не случилась раньше, по более интересным вопросам.