Как решить, использовать ли потоки или создать отдельный процесс в вашем приложении для достижения parallelism.
Процесс против потоков
Ответ 1
Нити более легкие, и для создания нескольких "рабочих" просто для использования всех доступных процессоров или ядер, вам лучше с потоками.
Когда вам нужно, чтобы рабочие были лучше изолированы и более надежны, как и большинство серверов, отправляйтесь с сокетами. Когда один поток сильно падает, он обычно снимает весь процесс, включая другие потоки, работающие в этом процессе. Если процесс становится кислым и умирает, он не касается какого-либо другого процесса, поэтому они могут с радостью продолжать заниматься своим бизнесом, как будто ничего не произошло.
Ответ 2
Процессы имеют более изолированную память. Это важно по ряду причин:
- Сложнее выполнить одну задачу для выполнения других задач.
- В каждом процессе будет доступно больше памяти. Это важно для крупных высокопроизводительных приложений, таких как Apache или серверов баз данных, таких как Postgres. Это важно как для выделенной памяти, так и для файлов с отображением памяти.
Ответ 3
Степень parallelism в основном зависит от физических процессоров/ядер, доступных на вашем компьютере. Если у вас есть однопроцессорная/ядерная машина, то отдельные процессы могут вызвать слишком много накладных расходов. В этом случае, как правило, предпочтительными являются нитки.
Если у вас несколько ядер/процессоров, то в зависимости от того, что делает каждый процесс/поток, вы можете выбрать процессы, если накладные расходы оправданы. Процессы, очевидно, имеют намного лучший уровень изоляции памяти, чем потоки, но в то же время в Windows процессы довольно тяжелы, по сравнению с потоками.
Темы, конечно, могут обмениваться данными в одном и том же процессе - но вам еще нужно будет синхронизировать доступ к общим данным - чтобы предотвратить повреждение. Совместное использование данных между процессами в большей степени связано с накладными расходами (которые сглажены, чем простая синхронизация потоков) в зависимости от используемых механизмов, таких как именованные каналы, пользовательская связь на основе сокетов, с использованием инфраструктуры удаленного доступа, общего файла/базы данных и т.д.
Ответ 4
Как правило, вы должны использовать процессы, когда отдельным потокам выполнения не требуется общий доступ к глобальным данным, и вы хотели бы, чтобы каждый из них защищен от другого.
Ответ 5
Несколько ссылок, которые могут помочь вам решить, я надеюсь:
http://blog.labnotes.org/2006/08/29/why-processes-scale-better-than-threads/
http://www.jroller.com/cpurdy/entry/fastcgi_not_so_fast
Ответ 6
В Windows процессы сложнее создавать потоки. Поэтому, если у вас есть несколько небольших задач, поток или поток пула будет лучше. Или используйте пул процессов для повторного использования процессов. Также совместное использование состояний между процессами - это больше работы, чем совместное использование состояний между потоками. Но опять же: потоки могут дестабилизировать полный процесс, связанный с другими потоками. Если вы хотите свести к минимуму вероятность этого, вы можете пойти на отдельные процессы..Net AppDomains может быть промежуточной средой между ними.