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

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

Загадки Python - Генерация простых чисел!
Загадки Python - Генерация простых чисел!
Обычно существует несколько способов решения задач даже пограничной сложности. Как же определить оптимальное и эффективное решение?
24
0
11 037
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

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

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

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

Ответ принят как подходящий

Потоки более легкие, и для создания нескольких «рабочих» просто для использования всех доступных процессоров или ядер вам лучше использовать потоки.

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

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

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

Другие вопросы по теме