Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top