Parallel.Invoke — динамическое создание дополнительных «потоков»

Я изучаю Parallel.Invoke и параллельную обработку в целом для использования в текущем проекте. Мне нужен толчок в правильном направлении, чтобы понять, как вы можете динамически \ разумно выделять больше параллельных «потоков» по ​​мере необходимости.

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

Для меня это типичная задача, решение которой может выиграть от параллельной обработки.

В качестве простого первого прохода это реализовано в следующем коде.

Parallel.Invoke(
  ()=> readFileLinesToBuffer(),
  ()=> parseFileLinesFromBuffer(),
  ()=> updateResultsToDatabase()    
);

За кулисами

  1. readFileLinesToBuffer() считывает каждую строку и сохраняет в буфер.
  2. Появляется parseFileLinesFromBuffer и потребляет строки из буфера, а затем, скажем, помещает их в другой буфер, чтобы updateResultsToDatabase() мог прийти и использовать этот буфер.

Таким образом, показанный код предполагает, что каждый из трех шагов использует одинаковое количество времени\ресурсов, но допустим, что parseFileLinesFromBuffer() является длительным процессом, поэтому вместо запуска только одного из этих методов вы хотите запустить два параллельно .

Как вы можете сделать так, чтобы код разумно решил сделать это на основе любых узких мест, которые он мог бы обнаружить?

Концептуально я вижу, как может работать некоторый подход к мониторингу размеров буфера, порождая, например, новый «поток» для потребления буфера с увеличенной скоростью... но я полагаю, что этот тип проблемы рассматривался при сборке библиотека ТПЛ.

Несколько примеров кода было бы здорово, но мне просто нужно понять, какие концепции я должен исследовать дальше. Похоже, System.Threading.Tasks.TaskScheduler содержит ключ?

5
задан SleepyBoBos 31 May 2012 в 04:42
поделиться