Проверьте количество неактивных ядер при создании параллельной задачи .Net 4.0 - PullRequest
0 голосов
/ 01 ноября 2010

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

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

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

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

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

  • Сократите ваши задачи (возможно, не вариант).

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

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

См. Раздел «Ввод резьбы» здесь:

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

0 голосов
/ 25 ноября 2010

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

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

0 голосов
/ 02 ноября 2010

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

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

...