У меня есть один поток данных, который должен быть обработан как можно быстрее. Единый поток содержит данные до 200 источников. Не все источники выдают одинаковый объем данных, и скорость может отличаться.
В качестве начальной попытки я решил создать 10 (в зависимости от спецификации сервера, двухъядерный процессор), долго выполняющиеся задачи. Каждая задача будет читать из BlockCollection. Прежде чем начать, я создал карту, чтобы по мере получения данных во входящем потоке я знал, к какой BlockingCollection добавить эти источники данных.
Проблема, я думаю, заключается в том, что я не знаю заранее, какой источник будет производить наибольшее количество данных, и, действительно, это может измениться со временем. Я видел, что некоторые коллекции были очень пустыми, в то время как другие получали гораздо больше обновлений.
Если у меня доступно 8 аппаратных потоков, и я создал около 10 очередей, а задачи не связаны с потоком (опять же, не уверен, верно ли это для TaskCreationOptions.LongRunning
), то даже если одна очередь не занята, другая занятая очередь не может использовать резервный поток, так как в теории я мог бы обработать часть данных вне последовательности.
Было бы лучше, если бы я просто создавал коллекцию задач и блокировок для каждого источника, тогда TPL сможет наилучшим образом использовать доступные потоки, поскольку данные максимально разделены?
Моя другая альтернатива состояла в том, чтобы как-то потренироваться на прошлой статистике и различной внешней / человеческой информации, как наилучшим образом распределить источники среди конечного набора BlockingCollections / Tasks, а затем скорректировать сопоставление во времени.
Надеюсь, я достаточно хорошо объяснил свой сценарий.
Я использую класс, который инкапсулирует BlockingCollection и Task
У меня есть то, что можно визуализировать как чередование более 40 потоков, которые в случае разделения обрабатываются одновременно (если каждый поток хранится в своей собственной последовательности), но потоков намного больше, чем доступных аппаратных потоков.
РЕДАКТИРОВАТЬ - Попытка уточнить мой запрос
Чтобы попытаться уточнить, что я ищу. В настоящее время я эффективно делю источники на подгруппы и выделяю каждой группе свою очередь. Мой вопрос действительно: сколько групп создать? Если у меня есть 200 источников, я должен создать 200 групп (то есть 200 заданий и коллекций блокировок), а затем позволить TPL бегать, как сумасшедший, распределяя потоки, где это возможно, так как каждая задача получает свое время процессора. Или мне лучше выделить 1 группу для каждого аппаратного потока?