问题标签 [tpl-dataflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3147 浏览

.net - TPL 数据流(TDF)和响应式扩展有什么区别?

经过几天的谷歌搜索,我想我无法决定哪一个适用于什么场景。当然,我想使用一个结合了两者的完美框架(当然不切实际)。我什至知道可以一起使用它们。但真正的问题是,每一个中的核心设计元素是什么,使得它们无法相互模仿。这些是我找到的:

  • 在 RX 中存在虚拟时间,因此调度程序有效地控制整个网络,但在 TDF 中这是不可能的,因为每个块使用不同的任务并且它们独立运行
  • 在 TDF 中,一个块可以重试接收消息/重发之类的东西,但在 RX 中这是不可能的。
  • 在 rx 中,数据流是序列化的,但在 TDF 中这是可选的

最好有一些不是列表的理解,而是试图从一个共同的抽象类/类别中派生出的东西,只谈论结构差异。

0 投票
1 回答
407 浏览

c# - 从单个基于线程的任务中收集来自多个基于 IO 的任务的数据

使用 TPL,我如何从多个 IO 源(“无线程”任务)收集结果并将它们合并到一个序列中,因为它们从各自的源进来,而不为每个源生成一个基于线程的任务来监视它们?从一个线程轮询源是否安全?

那样的事情怎么样?

0 投票
1 回答
682 浏览

.net - 用于异步流水线化 4 个块的 TPL 数据流设计

这是一个关于TPL Dataflow ProducerConsumer Pattern的新问题,Svick 已经回答了这个问题。

  1. 我需要并行处理4个2gb的文件,需要逐个缓冲区读取文件内容缓冲区。(这里使用生产者模式。Maxdegreeofparallelism = 4,我可以一次发布 4 个缓冲区)
  2. 需要处理缓冲区并写入中间表。(这里使用消费者模式。)
  3. 内存中的数据表将根据业务规则进行转换并写入规范化表。
  4. 内存中的数据再次被重新用于对最终版本的数据进行更多验证。

目前,第 3 步和第 4 步未使用任何块。它通过来自消费者的顺序函数调用。

  1. 这个设计正确吗?
  2. 除了使用生产者消费者方法之外,有没有办法将 4 个块逐个流水线并并行处理所有这些块?你能帮我一个小示例代码吗?
0 投票
2 回答
2739 浏览

c# - TPL 数据流如何阻止下游获取源生成的数据?

我正在使用 TPL 数据流处理图像。我收到一个处理请求,从流中读取图像,应用几个转换,然后将生成的图像写入另一个流:

为此,我使用了这些块:

问题是最初Request的内容包含创建结果所需的一些数据Stream以及我当时需要的一些附加信息。我是否必须将原始Request(或其他一些上下文对象)向下传递writerBlock到所有其他块,如下所示:

(这很丑陋),或者有没有办法将第一个块链接到最后一个块(或者概括地说,链接到需要额外数据的块)?

0 投票
1 回答
570 浏览

.net - TPL 数据流线程本地数据

有没有一种将线程本地数据传递到 ActionBlock 的好方法,这样如果您在其 DataFlowExecutionOptions 中指定 MaxDegreeOfParallelization 为 > 1,那么执行该操作的每个任务都会有自己的线程本地数据?

这是我的一些代码,可能会阐明我想要做什么:

我希望能够让 ActionBlock 调用我提供的线程本地初始化函数。像这样的东西:

并让它将我的线程本地数据传递给我的 Action 函数:

0 投票
1 回答
439 浏览

c# - Dataflow 中的嵌套块

我可以在 TPL 数据流中的其他块中调用块吗?这是一种好习惯吗?因此,如果我正在处理包含 4 个通道(R、G、B、A)的图像层,ProcessLayer 块会将所有 4 个通道输入到 ProcessChannel 块中,然后在完成后对输出进行处理。这是犹太洁食还是我应该尝试将块拆分,以便 ProcessLayer 输出 4 个通道,而不是在其内部发布每个通道块?

上下文:我正在使用自定义解析器处理 PSD 图像文件,该解析器是图层->通道图。同步地,我遍历每一层,遍历每个通道。说 PSD 的大小有时是 500mb+,这需要很长时间,所以我决定尝试 TPL Dataflow。

0 投票
1 回答
890 浏览

c# - TransformManyBlock,是否需要显式处理返回空的 IEnumerable,以免它们保留在内存中?

我实现了一个,我想知道当我在块中TransformManyBlock<Tin,Tout>返回一个空时,该空会保留在系统中的任何位置,还是会被垃圾收集或丢弃?显然,如果我改用 a ,我需要自己处理这种情况,但我想知道这是否已经由.IEnumerableIEnumerableIEnumerableTransformBlockTransformManyBlock

我想我想知道的是 TPL 是否会为我处理那个空的 IEnumerable 的处理,或者我是否需要自己处理它。

0 投票
1 回答
212 浏览

c# - 我可以在运行时将 TransfromBlock 中的一个 Func“热交换”为另一个吗?

我有以下设置TransformBlock

我想知道我是否可以在运行时将 func1 换成 func2,以及这个 transformBlock 和其他数据块之间的所有链接是否会保持不变?理想情况下,在交换功能时,我只是希望新的转换适用于所有新传入的项目。显然,通过这种简单化的方法,我不会对当前在队列中的项目以及如何处理它们做出假设。我只是想知道分配一个新的 Func 是否会导致运行时错误或导致 transformBlock 被取消链接。谁能分享一些见解?

编辑:在这里发布 Jon 的建议和代码一些非常基本的测试代码。让我好奇的是,它可以在有无volatile关键字的情况下使用。为什么我们需要volatile

编辑(包括谓词交换):

0 投票
1 回答
87 浏览

.net - 任务运行失败

我编写了一个小实用程序来读取大型文本文件并搜索包含搜索词的行。我以此为契机学习 TPL 数据流。

该代码工作正常,除非搜索词靠近文件的最后。在这种情况下,除非其中有断点,否则uiResult不会调用操作块。

我的理解是数据发布到uiResultfrom searcher之后变得完整(它searcher已经处理了最后一个数据块)。由于数据已经过帐,uiResult因此在处理完该数据之前,它不应该变得完整。

问题

为什么uiResult即使将数据发布到它也会变得完整(除非在 中设置断点uiResult)?

代码

这是相关代码,尽可能精简:

0 投票
1 回答
586 浏览

c# - TPL Dataflow 本地存储或类似的东西

我想要完成的是我有一个带有MaxDegreeOfParallelism = 4. 我想为每个并行路径创建一个会话对象的本地实例,所以我想要总共 4 个会话对象。如果这是线程,我会创建类似的东西:

我知道块不是线程,所以我正在寻找类似但块的东西。有什么方法可以创建这个吗?

该块处于服务状态并连续运行数月。在此期间,块的每个并发槽使用大量线程,因此线程本地存储不合适。我需要一些与逻辑块插槽相关的东西。此外,此块永远不会完成,它会运行服务的整个生命周期。

注意:上述建议的答案对我的要求无效。我特别要求与线程本地不同的东西,上面的答案是使用线程本地。这完全是一个不同的问题。