gpt4 book ai didi

c# - 了解 TPL 数据流并行度排序

转载 作者:太空狗 更新时间:2023-10-29 23:29:16 27 4
gpt4 key购买 nike

我正在阅读 Dataflow (Task Parallel Library) , 并且有一部分说:

When you specify a maximum degree of parallelism that is larger than 1, multiple messages are processed simultaneously, and therefore, messages might not be processed in the order in which they are received. The order in which the messages are output from the block will, however, be correctly ordered.

这是什么意思?

例如,我将我的操作 block 设置为并行度 = 5:

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

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

我的 Producer() 基本上将数字排队到 block 中:

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

我的 Consumer(i) 只需写下以下几行:

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

这是否意味着 Consumer(2) 将被阻塞,直到 Consumer(1) 完成处理(因为有 5 秒的延迟)?我测试了代码,但似乎并非如此。即使我删除了 5 秒的延迟,我也看不到输出是有序的。

[更新]

bBlock = new BufferBlock<int>(option);

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

bBlock.LinkTo(testActionBlock);

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

我的 Producer() 现在将添加到 bBlock:

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

那么,在这种情况下,Consumer(1) 将等待 5 秒,然后 Consumer(2) 才能继续?

最佳答案

没有。 DoP 你可以认为是线程(不完全是,但很容易想到它)

所以在 5 时,它将尝试一次处理 5 个。由于#1 用时 5 秒,#2 肯定会先完成。 #3、#4 和#5 可能也会如此。甚至可能是 #6(因为 #2 已经完成,DoP 将允许它从 #6 开始)

即使没有延迟,也不能保证处理顺序。所以永远不要依赖于他们执行的命令。话虽如此,当您使用消息输出(NOT 打印,因为这是它们执行的顺序)时,它们将按照它们进入的顺序重新排序,即使它们以任意顺序执行订单。

关于c# - 了解 TPL 数据流并行度排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39172554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com