Другой подход заключается в использовании конвейера потока данных . Я добавил этот более поздний ответ, потому что я считаю, что Dataflows гораздо лучше подходит для решения подобных проблем, проблемы с несколькими пулами потоков. Они обеспечивают более гибкий и структурированный подход и могут легко масштабироваться по вертикали.
Вы можете разбить свой код на один или несколько блоков, затем связать их с потоками данных, а затем дать возможность механизму потоков данных распределять потоки в соответствии с доступностью процессора и памяти
Я предлагаю разбить на 3 блока: один для подготовки запроса к странице сайта, один для доступа к странице сайта и последний для анализа данных.
Таким образом, медленный блок (get) может иметь больше потоков, выделенных для компенсации.
Вот как будет выглядеть настройка Dataflow:
var linkOptions = new DataflowLinkOptions { PropagateCompletion = true };
prepareBlock.LinkTo(get, linkOptions);
getBlock.LinkTo(analiseBlock, linkOptions);
Данные будут передаваться с prepareBlock
до getBlock
, а затем до analiseBlock
.
Интерфейсы между блоками могут быть любого класса, просто должны быть одинаковыми. См. Полный пример на конвейере потока данных
Использование потока данных будет примерно таким:
while ...{
...
prepareBlock.Post(...); //to send data to the pipeline
}
prepareBlock.Complete(); //when done
analiseBlock.Completion.Wait(cancellationTokenSource.Token); //to wait for all queues to empty or cancel