Проверьте количество простых ядер при создании параллельной задачи .NET 4.0

StackOverflow https://stackoverflow.com/questions/4067409

Вопрос

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

Я пишу приложение, которое обрабатывает входящие внешние данные. Для каждой данные, которые приходят к новой задаче, создается следующим образом:

System.Threading.Tasks.Task.Factory.StartNew(() => methodToActivate(data));

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

Спасибо!

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

Решение

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

  • Сделайте ваши задачи короче (вероятно, не вариант).

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

  • Используйте setmaxthreads для предотвращения неограниченного роста пула пула.

Смотрите раздел на резьбовой инъекции здесь:

http://msdn.microsoft.com/en-us/library/ff963549.aspx.

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

Вы должны смотреть в использование Производитель / Узор потребителей с А. BlockingCollection<T> вокруг А. ConcurrentQueue<T> где вы установили BoundedCapacity к тому, что имеет смысл, учитывая характеристики вашей рабочей нагрузки. Вы можете сделать ваш BoundedCapacity Настроен, а затем твик, когда вы проходите через некоторые профилирование сеансов, чтобы найти сладкое место.

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

Вы можете создать пользовательский TaskScheduler для параллельной библиотеки задачи, а затем расписание задач на это, передавая экземпляр его к TaskFactory конструктор.

Вот один пример того, как это сделать: Планировщик задач с максимальной степенью параллелизма.

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