@mkone112
Начинающий питонист.

В чем преимущества процессов над потоками?

Собственно вопрос в заголовке. Интересуют яп без GIL.
  • Вопрос задан
  • 1408 просмотров
Решения вопроса 4
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Главное приемущество: независимость процессов. Потоки делят между собой одну память и ресурсы системы (всякие хандлеры в винде, например).

Если один из процессов завершится или, что чаще происходит, упадет - остальные не будут затронуты. Плюс эта независимость позволяет делать песочницы для безопасности. Так, все современные браузеры запускают js и вообще каждую вкладку в отдельном процессе. Даже если куллхацкер полностью взломает браузер через специальный сайт, он окажется в процессе, который особо прав никаких не имеет, библиотеки особо интересные туда не загружены, а все общение с внешним миром - через жестко прописанные протоколы ipc (inter-process communication). Так что злодею придется взламывать еще и их.

Эта же независимость позволяет выполнять работу даже после завершения основного процесса. Так, если вы хотите сделать автообновятор программы, то после скачки/установки нового приложения, надо будет перезапустить основное приложение, чтобы перезаписать исполняемый файл (по крайней мере в винде). Но поток завершится вместе с программой и кто же тогда потом будет ее запускать? А вот процесс останется работать.

Недостатки тут - ресурсоемкость. С точки зрения системы поднять и поддерживать процесс гораздо больше работы чем сделать это с потоком. Плюс упомянутое выше ipc - это лишняя работа на каждый чих.
Ответ написан
Комментировать
Griboks
@Griboks
Вижу, вы - очередная жертва пина) В подавляющем большинстве языков отсутствует gil и, соответственно, понятие процессов. В таких языках есть потоки и корутины, которые в свою очередь асинхронны.
Ответ написан
shurshur
@shurshur
Сисадмин, просто сисадмин...
Вопрос уровня "в чём преимущества грибов над ягодами?" Это просто разные вещи со своими особенностями и нюансами, и нет смысла говорить о преимуществе одних или других без конкретного описания условий и требований.

На самом деле процесс и поток в реализации конкретной OS могут быть близки до такой степени, что потоки могут быть видны даже в списке процессов. Поэтому вполне можно сказать, что это практически одно и то же. Но не совсем.

Для создания нового процесса в UNIX-системах делаетя вызов fork, который создаёт полную копию текущего процесса, включая его код и данные (в других системах может не быть fork, но есть свои способы создания процесса). Для создания же нового потока также делается новый "процесс", но вместо копии данных и кода в нём передаётся ссылка на те же самые данные и код (очень по-питоновски - ссылка вместо deepcopy данных). Поэтому потоки могут работать с одними и теми же данными, а самостоятельные процессы нет. Но иногда это как раз и нужно. Например, потоки должны как-то отслеживать конфликты с доступом к одним и тем же данным, а для процессов такой проблемы не стоит.

Отдельно надо сказать, что понятие потоков и процессов в разных языках может быть реализовано не так, как это реализовано на уровне операционной системы. Например, JVM умеет делать потоки даже на системах без поддержки многозадачности. Она просто имитирует их внутри себя. Это же машина, виртуалка такая.
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
процессы не имеют общей памяти и вы ipc сами руками делаете это и плюс и минус
минус тормоза
плюсов больше не морозитесь насчет всего что с тредами идет просто тупо выполняете все подряд
если процесс упал вы повторяете , мастер процесс не зависит от криворуких потомков и от утечек памяти в них
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
iamkisly
@iamkisly
Собираю админки на dotnet и extjs
Процессы-потоки в том же nodejs дают базовую кластеризацию и распределенность "из коробки"
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Непонятно зачем в теме вопроса добавлено уточнение про GIL. Это специфика Python?

Добавлю что понятие процесса и потока может уж очень сильно отличаться в разных средах. Процесс в Erlang/OTP - это по сути актор который существует в сильной изоляции от всего остального мира и шарит память с другими процессами только через систему месседжей. Поток в Java - вообще не мапится в поток операционной системы.

Тоесть когда говорим о процессах и потоках то желательно сужать это определение до конкретной ОС и системы разработки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы