Когда не следует использовать ThreadPool в .Net?
Похоже, что наилучшим вариантом является использование ThreadPool, в таком случае, почему он не является единственным вариантом?
Каков ваш опыт в этом вопросе?
@Eric, I' m оказывающийся перед необходимостью соглашаться с Деканом. Нити дорогие. Вы can' t предполагают, что Ваша программа - единственное управление. Когда все жадные с ресурсами, проблема умножается.
я предпочитаю создавать свои нити вручную и управлять ими сам. Это сохраняет кодекс очень легким понять.
That' s прекрасный, когда it' s соответствующий. Если Вам нужна связка нитей рабочего, тем не менее, весь you' сделанный ve, делают Ваш кодекс более сложным. Теперь Вы должны написать кодекс, чтобы управлять ими. Если Вы просто использовали фонд нити, you' d получают все управление нитью бесплатно. И фонд нити, обеспеченный языком, очень вероятно, будет более прочным, более эффективным, и меньше детской коляски, чем, что Вы катите для себя.
Пронизывайте t = новая ветвь дискуссии (новый ThreadStart (DoSomething));
t. Начните ();
t. Соединение ();
Я надеюсь, что у Вас обычно был бы некоторый дополнительный кодекс промежуточным 'Началом ()' и 'Соединение ()'. Иначе дополнительная нить бесполезна, и you' опустошительные ресурсы ре ни по какой причине.
Люди слишком боятся ресурсов, используемых нитями. I' ve никогда замечаемое создание и старт нити, чтобы не взять больше, чем миллисекунда. Нет никакого трудного ограничения на количество нитей, которые Вы можете создать. Использование RAM минимально. Как только у Вас есть несколько сотен нитей, центральный процессор становится проблемой из-за выключателей контекста, таким образом, в том пункте Вы могли бы хотеть стать необычными со своим дизайном.
Миллисекунда долго время на современных аппаратных средствах. That' s 3 миллиона циклов на машине на 3 ГГц. И снова, Вы - not' t единственный, создающий нити. Ваши нити конкурируют за центральный процессор наряду с любым program' s нити. Если Вы используете не вполне слишком много нитей, и также - другая программа, то вместе you' ve использовал слишком много нитей.
Серьезно, don' t делают жизнь более сложной, чем это должно быть. Don' t используют фонд нити, если Вам не нужно что-то очень определенное, которое он предлагает.
Действительно. Don' t делают жизнь более сложной. Если для Вашей программы нужны несколько нитей рабочего, don' t перестраивают колесо. Используйте фонд нити. That' s, почему it' s там. Пожалуйста класс последовательности самокрутки?
Единственная причина, по которой я не стал бы использовать ThreadPool
для дешевой многопоточности, - это если мне нужно…
ThreadPool
- это фоновые потоки)P.S.: Статья MSDN "The Managed Thread Pool" содержит раздел под названием "When Not to Use Thread Pool Threads" с очень похожим, но чуть более полным списком возможных причин для отказа от использования пула потоков.
Существует множество причин, по которым вам следует отказаться от ThreadPool
, но если вы их не знаете, то ThreadPool
должен быть достаточно хорош для вас.
В качестве альтернативы посмотрите на новый Parallel Extensions Framework, в котором есть некоторые интересные вещи, которые могут подойти для ваших нужд без необходимости использования ThreadPool
.
Пулы потоков имеют смысл, когда у вас есть концепция рабочих потоков. Каждый раз, когда вы можете легко разделить обработку на более мелкие задания, каждое из которых может быть обработано независимо, рабочие потоки (и, следовательно, пул потоков) имеют смысл.
Пулы потоков не имеют смысла, когда вам нужны потоки, выполняющие совершенно разные и несвязанные действия, которые нельзя рассматривать как "задания", например, один поток для обработки событий GUI, другой - для обработки бэкенда. Пулы потоков также не имеют смысла, когда обработка формирует конвейер.
В принципе, если у вас есть потоки, которые запускаются, обрабатывают задание и завершают работу, то пул потоков, вероятно, будет правильным решением. В противном случае пул потоков не поможет.
К quarrelsome' s ответ, я добавил бы это it' s лучше всего, чтобы не использовать нить ThreadPool, если Вы должны гарантировать, что Ваша нить немедленно начнет работу. Максимальное количество управления объединенными с нитью нитями ограничено за appdomain, таким образом, Вашей обрабатываемой детали, вероятно, придется ждать если they' ре все занятые. It' s названный " пользователь очереди работает item" в конце концов.
Два протеста, конечно:
I' m, не говоря как кто-то с только теоретические знания здесь. Я пишу и поддержите приложения большого объема это делает интенсивное использование из мультипронизывания, и я обычно don' t находят нить бассейн, чтобы быть правильным ответом.
Ах, аргумент от власти - но всегда быть в поисках людей, которые могли бы быть в ядерной команде Windows.
Ни один из нас не спорил с тем, что, если у Вас есть некоторые конкретные требования тогда.NET ThreadPool не мог бы быть правильной вещью. Какой we' ре, возражающее против, является опошлением затрат для машины создания нити.
Значительный расход создания нити в разуме d' etre для ThreadPool во-первых. Я don' t хотят, чтобы мои машины были заполнены кодексом, написанным людьми, которые были дезинформированы о расходе создания нити и don' t, например, знают, что это заставляет метод быть названным в каждом DLL, который присоединен к процессу (некоторые из которых будут созданы третьими лицами), и который может хорошо горячий груз кодекса, который не должен быть в RAM вообще и почти наверняка didn' t должен быть в L1.
Форма иерархии памяти в современной машине означает это ' distracting' центральный процессор о худшей вещи, которую Вы можете возможно сделать, и все, кто заботится об их ремесле, должен упорно работать, чтобы избежать его.
Когда вы собираетесь выполнить операцию, которая займет много времени, или, возможно, непрерывный фоновый поток. Думаю, вы всегда можете увеличить количество доступных потоков в пуле, но нет смысла нести расходы на управление потоком, который никогда не будет возвращен в пул.
У MSDN есть список некоторые причины здесь:
http://msdn.microsoft.com/en-us/library/0ka9477y.aspx
есть несколько сценариев, в которых уместно создать и управляйте своими собственными нитями вместо того, чтобы использовать нити фонда нити:
- Вы требуете нити переднего плана.
- Вы требуете, чтобы у нити был особый приоритет.
- у Вас есть задачи, которые заставляют нить блокировать в течение долгих промежутков времени. У фонда нити есть максимальное количество нитей, таким образом, большое количество заблокированных нитей фонда нити могло бы предотвратить задачи от старт.
- Вы должны поместить нити в одно-переплетенную квартиру. Все нити ThreadPool находятся в многопоточной квартире.
- Вам нужно было связать стабильную идентичность с нитью, или посвятить нить задаче.
Нити Threadpool подходят для задач, которые соответствуют обоим из следующих критериев:
< ol> < li> задача не должна будет проводить значительное время, ожидая, что что-то произойдет < li> Что-либо that' s ждущий задачи закончиться будет, вероятно, ждать многих задач закончиться, таким образом, ее приоритет планирования isn' t склонный затронуть вещи очень. Используя нить threadpool вместо того, чтобы создать новую спасет значительное, но ограниченное количество времени. Если то время будет значительным по сравнению со временем, то это возьмет, чтобы выполнить задачу, threadpool задача вероятна соответствующий. Чем дольше время, требуемое выполнить задачу, однако, тем меньший выгода использования threadpool и большего вероятность задачи, препятствующей threadpool эффективность.@Eric
@Derek, я don' t точно соглашаются со сценарием, который Вы используете в качестве примера. Если Вы don' t знают точно what' s работа Вашей машины и точно то, сколько пронизывает общее количество, обращается, время центрального процессора, RAM, и т.д., который Ваше приложение будет использовать под определенным количеством груза, Вы в беде.
Действительно ли Вы - единственный целевой клиент для программ, которые Вы пишете? В противном случае Вы can' t быть уверенным в большей части из этого. Вы обычно понятия не имеете, когда Вы пишете программу, выполнит ли она эффективно соло, или если она будет работать на webserver быть ковавшимся DDoS-атакой. Вы can' t знают, сколько времени центрального процессора Вы собираетесь иметь.
Принятие program' s поведение изменяется на основе входа, it' s редкий, чтобы даже знать точно, сколько будут потреблять память или время центрального процессора Ваша программа. Несомненно, у Вас должна быть довольно хорошая идея о том, как Ваша программа собирается вести себя, но большинство программ никогда не анализируется, чтобы определить точно, сколько памяти, сколько ручек, и т.д. будет использоваться, потому что полный анализ дорогой. Если Вы - not' t написание программного обеспечения в реальном времени, выплата isn' t стоящий усилия.
В целом требование знать точно, как Ваша программа будет вести себя, неправдоподобно, и утверждающий знать все о машинных смехотворных подходах.
И честно говоря, если Вы don' t знают точно, какой метод Вы должны использовать: ручные нити, фонд нити, делегаты, и как осуществить его, чтобы сделать, в чем нужно Ваше заявление, Вы в беде.
Я don' t полностью не соглашаются, но я don' t действительно посмотрите как that' s релевантный. Это место здесь конкретно потому что программисты don' t всегда имеют все ответы.
Если Ваше заявление достаточно сложно, чтобы потребовать удушения количества нитей, которые Вы используете, not' t Вы почти всегда собирающийся хотеть больше контроля, чем, что структура дает Вам?
Нет. Если мне будет нужен фонд нити, я буду использовать один that' s, если, только после того как я нахожу, что это не достаточно. Я просто не предположу, что обеспеченный фонд нити недостаточен для моих потребностей, не подтверждая это, чтобы иметь место.
I' m, не говоря как кто-то только с теоретическими знаниями здесь. Я пишу и поддерживаю приложения большого объема, которые делают интенсивное использование из мультипронизывания и меня обычно don' t находят, что фонд нити правильный ответ.
Большая часть моего профессионального опыта была с мультипронизыванием и многопроцессорными программами. Я должен был часто катить свое собственное решение также. Это doesn' t означают, что нить объединяет isn' t полезный, или соответствующий во многих случаях. Фонд нити построен, чтобы обращаться с нитями рабочего. В случаях, где несколько нитей рабочего соответствующие, должен обеспеченный фонд нити, должен обычно быть первый подход.