Процесс против потоков - PullRequest
       6

Процесс против потоков

24 голосов
/ 15 сентября 2008

Как решить, использовать ли потоки или создать отдельный процесс в вашем приложении для достижения параллелизма.

Ответы [ 6 ]

15 голосов
/ 15 сентября 2008

Потоки имеют меньший вес, и для создания нескольких "рабочих", использующих все доступные процессоры или ядра, вам лучше использовать потоки.

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

5 голосов
/ 15 сентября 2008

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

  • Для одной задачи сложнее разбить другие задачи.
  • Для каждого процесса будет доступно больше памяти. Это важно для больших высокопроизводительных приложений, таких как Apache, или серверов баз данных, таких как Postgres. Это важно как для выделенной памяти, так и для файлов с отображенной памятью.
4 голосов
/ 15 сентября 2008

Степень параллелизма в основном зависит от физических процессоров / ядер, доступных на вашей машине. Если у вас компьютер с одним процессором или ядром, то наличие отдельных процессов может привести к слишком большой нагрузке. В этом случае обычно предпочтительнее использовать нити.

Если у вас несколько ядер / процессоров, то в зависимости от того, что делает каждый процесс / поток, вы можете выбрать процессы, если накладные расходы оправданы. Процессы, очевидно, имеют гораздо лучший уровень изоляции памяти, чем потоки, но в то же время в Windows процессы довольно тяжелые по сравнению с потоками.

Потоки, конечно, могут совместно использовать данные в одном и том же процессе, но, опять же, вам необходимо синхронизировать доступ к общим данным, чтобы предотвратить повреждение данных. Совместное использование данных между процессами является более сложным процессом, который требует дополнительных затрат (что выше, чем простая синхронизация потоков), в зависимости от используемых механизмов, таких как именованные каналы, настраиваемая связь через сокеты, использование инфраструктуры удаленного взаимодействия, общего файла / базы данных и т. Д.

2 голосов
/ 15 сентября 2008

Несколько ссылок, которые могут помочь вам решить, я надеюсь:

http://blog.labnotes.org/2006/08/29/why-processes-scale-better-than-threads/ http://www.jroller.com/cpurdy/entry/fastcgi_not_so_fast

2 голосов
/ 15 сентября 2008

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

1 голос
/ 15 сентября 2008

В Windows процессы тяжелее, чем потоки. Так что если у вас есть несколько небольших задач, поток или пул потоков будет лучше. Или используйте пул процессов для их переработки. Также разделение состояния между процессами - это больше работы, чем разделение состояния между потоками. Но опять же: потоки могут дестабилизировать завершенный процесс, уничтожая другие потоки. Если вы хотите свести к минимуму вероятность этого, вы можете перейти к отдельным процессам. Домены приложений .Net могут быть средним звеном между обоими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...