TPL 数据流:为什么 EnsureOrdered = false 会破坏此 TransformManyBlock 的并行性?

2024-01-18

我正在研究 TPL 数据流管道,并注意到与排序/并行性相关的一些奇怪行为TransformManyBlocks(也可能适用于其他块)。

这是我要重现的代码(.NET 4.7.2,TPL Dataflow 4.9.0):

class Program
{
    static void Main(string[] args)
    {
        var sourceBlock = new TransformManyBlock<int, Tuple<int, int>>(i => Source(i),
            new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 4, EnsureOrdered = false });

        var targetBlock = new ActionBlock<Tuple<int, int>>(tpl =>
        {
            Console.WriteLine($"Received ({tpl.Item1}, {tpl.Item2})");
        },
        new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 4, EnsureOrdered = true });

        sourceBlock.LinkTo(targetBlock, new DataflowLinkOptions { PropagateCompletion = true });

        for (int i = 0; i < 10; i++)
        {
            sourceBlock.Post(i);
        }

        sourceBlock.Complete();
        targetBlock.Completion.Wait();
        Console.WriteLine("Finished");
        Console.Read();
    }

    static IEnumerable<Tuple<int, int>> Source(int i)
    {
        var rand = new Random(543543254);
        for (int j = 0; j < i; j++)
        {
            Thread.Sleep(rand.Next(100, 1500));
            Console.WriteLine($"Returning ({i}, {j})");
            yield return Tuple.Create(i, j);
        }
    }
}

我期望的行为如下:

  • 源块应该并行返回元组,唯一的要求是它们应该按次要属性排序j.
  • 目标块应该按照接收到的顺序处理消息。

据我了解,二次排序条件是由以下性质满足的yield return, so EnsureOrdered可以设置为false。如果设置为true,源块将保留消息一段不可接受的时间,因为它将等待所有消息yield return在传递消息之前完成(在真实的应用程序中,要处理许多 GB 的数据,这意味着我们希望尽快通过管道传播数据,以便我们可以释放 RAM)。这是一个示例输出,当EnsureOrdered源块的设置为true:

Returning (1, 0)
Returning (2, 0)
Returning (4, 0)
Returning (3, 0)
Returning (2, 1)
Returning (4, 1)
Returning (3, 1)
Received (1, 0)
Received (2, 0)
Received (2, 1)
Returning (4, 2)
Returning (3, 2)
Received (3, 0)
Received (3, 1)
Received (3, 2)
Returning (5, 0)
Returning (6, 0)

我们可以看到源块并行工作,但等待传播消息,直到下一个块的所有消息都传播完毕。iin line 已生成(如预期)。

然而当EnsureOrdered对于源块是false(如代码示例中所示),我得到以下输出:

Returning (2, 0)
Received (2, 0)
Returning (2, 1)
Received (2, 1)
Returning (4, 0)
Received (4, 0)
Returning (4, 1)
Received (4, 1)
Returning (4, 2)
Received (4, 2)
Returning (4, 3)
Received (4, 3)
Returning (1, 0)
Received (1, 0)
Returning (3, 0)
Received (3, 0)
Returning (3, 1)
Received (3, 1)
Returning (3, 2)
Received (3, 2)

源块在可用时成功传播消息,但是似乎并行性丢失了,因为它只处理一个i一次。

为什么是这样?我怎样才能强制它并行处理?


此处正在进行修复:https://github.com/dotnet/corefx/pull/31059 https://github.com/dotnet/corefx/pull/31059

感谢您的报告!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TPL 数据流:为什么 EnsureOrdered = false 会破坏此 TransformManyBlock 的并行性? 的相关文章

  • 获取数组变量的地址是什么意思?

    今天我读到了一段让我很困惑的 C 代码片段 include
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是

随机推荐

  • 收到错误:图形 API 版本不匹配

    当我运行时出现以下错误shiny Error Graphics API version mismatch Listening on http 127 0 0 1 3774 Warning Error in Cairo Graphics AP
  • Collections.sort() 比较方法违反了 Java 中的一般约定[重复]

    这个问题在这里已经有答案了 我知道这种问题已经被问过数百万次 如果不是数十亿次 但我还找不到答案 This compare 方法没有Long Double Float 它只有Date boolean and Null检查员 但是它告诉我co
  • 如何获取和设置 EmguCV Mat 图像的像素值?

    我正在使用 OpenCV 3 0 库的 EmguCV 3 0 0 包装器 我正在使用Mat在几个地方上课 这是一个单通道 8x8 图像的示例double values Mat image new Mat 8 8 DepthType Cv64
  • 主键中允许 NULL - 为什么以及在哪个 DBMS 中?

    进一步我的问题 为什么在 SQL 中使用 非空主键 https stackoverflow com questions 3905703 why to use not null primary key in tsql As I underst
  • 学习 monodevelop 并且无法显示消息框

    我正在 monodevelop 工作并学习 c 我试图显示一个消息框 但无法使其正常运行 这是我的代码 using System using Gtk using GtkSharp public partial class MainWindo
  • SwiftUI:VStack/HStack/ZStack 拖动手势不起作用

    我不明白为什么DragGesture不适用于 VStack HStack ZStack 考虑以下简单示例 struct ContentView View State private var offset CGSize zero var bo
  • Vista/Win2008 上的关键部分泄漏内存?

    看来在 Vista Windows Server 2008 中大量使用关键部分会导致操作系统无法完全重新获得内存 我们在 Delphi 应用程序中发现了这个问题 这显然是因为使用了 CS API 看这个所以问题 https stackove
  • 将 swf 转换为 mp4

    这个答案没有帮助 将压缩的 swf 转换为 mp4 https stackoverflow com q 20194270 630169 尝试转换 swf 文件 ffmpeg 输出 ffmpeg i GTDS demo new swf GTD
  • 如何使 spring @retryable 可配置?

    我有这段代码 Retryable maxAttempts 3 stateful true include ServiceUnavailableException class exclude URISyntaxException class
  • jquery读取嵌套的json

    我有以下 json 如下所示 我正在尝试读取值 TOP1 TOP2 我有点不确定该怎么做 我正在使用以下内容 但这只会给我一个包含 TOP1 和 TOP2 嵌套对象的对象 如何获取 TOP1 和 TOP2 值 getJSON http lo
  • 将 TArray 类型转换为 X 数组是否安全?

    今天我发现了一个编译器错误 QC 108577 http qc embarcadero com wc qcmain aspx d 108577 以下程序无法编译 program Project1 APPTYPE CONSOLE proced
  • 系统找不到JavaApplicationLauncher

    我正在运行 Mac OS X 版本 12 0 1 也称为 Monterey 我已经安装了 MultiWii 程序来控制我正在构建的无人机 本教程逐步介绍下载 解压 甚至适用于 MacOS 的特殊 chmod 指令 然而 当我尝试运行 Mul
  • 读取、读取部分读取

    我似乎无法在文档中找到有关此内容的信息 The read系统调用文档说它读取的数据可能少于指定的数据 做read尝试阅读几次 我知道fread是一个包装器read 当我调用fread 它是否有可能多次从流中读取 直到它变为 0 或读取指定的
  • 如何围绕轮廓绘制矩形?

    我刚刚开始使用 opencv 我正在尝试制作一个程序 在沙子上的岩石图片周围放置方块 该函数的文档here http docs opencv org modules imgproc doc structural analysis and s
  • 如何将 Vec> 移动到 Vec>>

    我有一个Vec
  • Python 中使用回溯记录异常

    如何记录 Python 异常 try do something except How can I log my exception here complete with its traceback Use logging exception
  • 弹性容器中的等高行

    如您所见 list items在第一个row有相同的height 但第二个项目row有不同的heights 我希望所有物品都有统一的height 有什么方法可以在不付出的情况下实现这一目标固定高度并且只使用flexbox 这是我的code
  • 向上滚动时折叠工具栏图像消失

    我正在尝试实现一个带有大标题图像的折叠工具栏 我希望图像开始时非常大 并且它有效 并且不完全崩溃 这也有效 问题是 当工具栏达到最小可折叠高度时 图像会消失 并褪色为应用程序的主要颜色 我希望图像即使在折叠时也保持可见 另外 后退按钮与图片
  • 可观察集合替换项目

    我有一个ObservableCollection 我可以从集合中添加和删除项目 但我无法替换集合中的现有项目 有一种方法可以替换项目并将其反映在我的绑定组件上 System Collections Specialized NotifyCol
  • TPL 数据流:为什么 EnsureOrdered = false 会破坏此 TransformManyBlock 的并行性?

    我正在研究 TPL 数据流管道 并注意到与排序 并行性相关的一些奇怪行为TransformManyBlocks 也可能适用于其他块 这是我要重现的代码 NET 4 7 2 TPL Dataflow 4 9 0 class Program s