Подтвердить что ты не робот

Реализация параллельных задач в .NET.

Изображение говорит больше, чем слова, поэтому вот в основном я хочу достичь:
(Я также использовал фруктовую аналогию ради простоты простоты)
enter image description here

В прошлом я много раз занимался этим, используя разные классы .Net(BackGroundWOrkers, ThreadPool, Self Made Stuff...)

Я прошу здесь ради совета и получить свежие идеи о том, как сделать это эффективно.
Это высокая вычислительная программа, поэтому я получаю миллионы (похожих по структуре, но не по содержанию) данных, которые должны быть поставлены в очередь для обработки в соответствии с типом содержимого. Следовательно, я хочу избежать создания параллельной задачи для каждой отдельной обрабатываемой информации (это перегружает процессор и плохой дизайн IMHO). Вот почему я получил идею иметь только один поток, выполняемый для КАЖДОГО ТИПА данных, предназначенный для его обработки (зная, что метод "Пресс-сок" является общим и не зависит от плода, который нужно нажать)

Любые идеи и предложения по внедрению приветствуются.
Я могу дать более подробную информацию.

4b9b3361

Ответ 2

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

Более гибким и эффективным подходом было бы использование потока данных TPL. При этом вы не работаете с потоками или задачами, вы работаете с блоками. Например, ваш поток C может быть представлен как TransformBlock<Apple, AppleJuice>.

По умолчанию каждый блок использует не более одного потока, но их можно легко настроить для использования большего количества из них (установив MaxDegreeOfParallelism). Кроме того, блоки потока данных хорошо работают с новым С# 5.0 async - await, что может быть большим преимуществом.

Есть также вещи, о которых вы должны быть осторожны. Например, TDF по умолчанию оптимизирован для пропускной способности, а не для задержки. Итак, если ваш пул потоков занят, и у вас много апельсинов и только одно яблоко, возможно, что яблоко будет обработано только после того, как все апельсины будут. Но это можно также исправить, правильно настроив блоки (установив MaxMessagesPerTask).

Ответ 3

Я бы предостерег от подхода "рабочий поток на тип данных". Это делает предположение, что фактическая входная нагрузка будет соответствовать классам эквивалентности, которые удобны для разработчиков. Вы знаете, если бананы в 5 раз медленнее, чем соки, чем апельсины? Что произойдет, если каждый вторник будет "днем празднования яблока", и все соки получат больше фруктов, чем обычно, и все это яблоки?

Выполнение параллельных операций - это производительность, а не домен. Не моделируйте его после своего домена, моделируйте его, чтобы обеспечить наименьшее среднее время цикла.