2016-08-26 6 views
5

Я читал Dataflow (Task Parallel Library), и есть часть, которая говорит:Понимание TPL Dataflow Степень параллельности заказа

При указании максимальной степени параллелизма, который больше, чем 1, несколько сообщений обрабатываются одновременно, и поэтому сообщения могут не обрабатываться в том порядке, в котором они получены. Однако порядок, в котором сообщения выводятся из блока, будет правильно упорядочен.

Что это значит?

Пример, я могу установить блок действий со степенью параллельности = 5:

testActionBlock = new ActionBlock<int>(i => Consumer(i), 
      new ExecutionDataflowBlockOptions() 
      { 
       MaxDegreeOfParallelism = 5 
      }); 

await Producer(); 
testActionBlock.Completion.Wait(); 

Мой продюсер() в основном очереди чисел в блоке:

private async Task Producer() 
{ 
    for (int i=0; i<= 1000; i++) 
    { 
     await testActionBlock.SendAsync(i); 
    } 
    testActionBlock.Complete(); 
} 

И мой Потребитель (я) просто выпишите строки:

private async Task Consumer(int i) 
{ 
    if (i == 1) 
    { 
     await Task.Delay(5000); 
    } 
    Console.WriteLine(i); 
} 

Означает ли это, что Потребитель (2) будет заблокирован до Потребителя (1) га (с задержкой 5 секунд)? Я тестировал код, и, похоже, это не так. Даже когда я удалял задержку 5 секунд, я не вижу, чтобы результат был в порядке.

[Update]

bBlock = new BufferBlock<int>(option); 

testActionBlock = new ActionBlock<int>(i => Consumer(i), 
    new ExecutionDataflowBlockOptions() 
    { 
     MaxDegreeOfParallelism = 5 
    }); 

bBlock.LinkTo(testActionBlock); 

await Producer(); 
testActionBlock.Completion.Wait(); 

Мой продюсер() теперь добавим к bBlock:

private async Task Producer() 
{ 
    for (int i=0; i<= 1000; i++) 
    { 
     await bBlock.SendAsync(i); 
    } 
    bBlock.Complete(); 
} 

Таким образом, в этом случае Потребитель (1) будет ждать в течение 5 сек, прежде чем потребитель (2) может продолжить?

ответ

3

No. DoP вы можете думать как потоки (не точно, но легкий способ думать об этом)

Таким образом, на 5, он будет пытаться обработать 5 одновременно. Поскольку # 1 занимает 5 секунд, # 2, безусловно, закончится первым. Вероятно, так будет # 3, # 4 и # 5. Вероятно, даже №6 (начиная с № 2, DoP позволит ему начать работу на # 6)

Даже без задержки гарантийный заказ на обработку не гарантируется. Поэтому никогда не зависеть от ЗАКАЗАТЬ, ЧТО ОНИ ВЫПОЛНИТЬ. Сказав это, когда вы используете выходы сообщений (NOT prtinting, так как это порядок, который они выполняют), они будут переупорядочены в том порядке, в котором они вошли, даже если они выполнены в произвольном порядке.

+0

благодарит за разъяснения. Но я до сих пор неясно, когда говорится, что «выходы сообщений ... будут переупорядочены». Я обновил свой оригинальный вопрос, чтобы узнать, правильно ли я понял? – SimonSays

+0

Поток данных TPL обеспечивает полный механизм обмена сообщениями, предназначенный для получения данных в блоках и из них. Ознакомьтесь с этим отличным руководством от MS с точными примерами. https://msdn.microsoft.com/en-us/library/hh228597(v=vs.110).aspx – Tim

 Смежные вопросы

  • Нет связанных вопросов^_^