Почему использование ThreadPool имеет преимущества по сравнению с потоковым подходом? - PullRequest
0 голосов
/ 01 июля 2019

В моем учебнике написано:

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

и

при параллельном запуске нескольких длительных задач производительность может страдать, тогда лучше использовать потоковый подход

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

И, наконец, почему потоковый подход (например, использование new Thread(runMethod).Start()) лучше для долгосрочных задач?

1 Ответ

0 голосов
/ 01 июля 2019

ThreadPool имеет ограниченное количество многоразовых нитей.Эти темы используются для задач (например, Task.Run).Задача, которая выполняется в течение более длительного периода времени, заблокирует поток, чтобы его нельзя было повторно использовать для другого Task.Таким образом, чтобы всегда иметь достаточно ThreadPool доступных потоков (например, для async / await, Parallel Linq и т. Д.), Вы должны использовать ThreadPool независимых потоков для такого рода задач.
Это можно сделать с помощью Task.Factory.StartNew(Action, TaskCreationOptions) (или любая другая перегрузка, которая принимает объект TaskCreationOptions) и затем передает параметр TaskCreationOptions.LongRunning.LongRunning вызывает новый поток, который не зависит от ThreadPool.

Таким образом, для всех длительных и основанных на IO задач, таких как чтение файла или базы данных, вы должны использовать ThreadPool независимые потоки, вызывая Task.Factory.StartNew(() => DoAction(), TaskCreationOptions.LongRunning);.Вам вовсе не нужно new Thread(runMethod).Start(). Потоки

ThreadPool более ресурсоэффективны, поскольку их можно использовать повторно.Таким образом, при извлечении потоков ThreadPool они уже созданы.Создание новых тем всегда дорогой ресурс.Они должны быть зарегистрированы, стеки вызовов должны быть созданы, локальные пользователи должны быть скопированы и т. Д. Вот почему при рассмотрении производительности предпочтительнее выбирать многоразовые потоки, если рабочая нагрузка легкая (короткая работа).

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