Вопрос

У меня есть постоянный поток определенных предметов, которые мне нужно для обработки параллельно, поэтому я использую TPL Dataflow.Улов состоит в том, что предметы, которые разделяют один и тот же ключ (аналогично словарю), должны обрабатываться в порядок FIFO и не быть параллельным друг другу (они могут быть параллельны другим элементам с разными значениями).

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

Создание:

_actionBlocks = new ActionBlock<Item>[Environment.ProcessorCount];
for (int i = 0; i < _actionBlocks.Length; i++)
{
    _actionBlocks[i] = new ActionBlock<Item>(_ => ProcessItemAsync(_));
}
.

Использование:

bool ProcessItem(Key key, Item item)
{
    var actionBlock = _actionBlocks[(uint)key.GetHashCode() % _actionBlocks.Length];
    return actionBlock.Post(item);
}
.

Итак, мой вопрос, это лучшее решение для моей проблемы?Я причиняю вред производительности / масштабируемости?Я что-то упускаю?

Это было полезно?

Решение

Я думаю, что ваш подход разумно, предполагая, что вы знаете, что хеш-коды будут распространяться хорошо.

Если вы хотите иметь лучшую защиту от плохих распределений, вы можете использовать большее количество Genacodicetagcodcode, одновременно ограничивая их общий уровень параллелизма, используя единый пользовательский ActionBlock совместно используются всеми блоками.Вы можете найти такой планировщик в paralleLextensionsextras или на MSDN .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top