【问题标题】:TPL Dataflow - Controlling which items are in the flow at any one timeTPL 数据流 - 随时控制流中的项目
【发布时间】:2014-07-18 18:07:25
【问题描述】:

我需要处理商家发送给我们的文件。每个文件名将包含商家的 ID。例如。 Products - 118763.csv,其中数字是商家id。

我想设置一个数据流来处理这些文件。可以同时处理多个文件。

但是,必须按顺序处理每个商家的文件。也就是说,不能同时处理特定商家的两个文件。

我不确定如何使用数据流对此进行建模。我可以监控当前正在处理哪些商家,但我不知道如何确保我不会同时处理来自同一商家的两个文件,同时仍能同时处理尽可能多的文件。

似乎我需要过滤从队列中取出的内容,但我一次只能获取一项,一旦获得,然后呢。我可以重新排队,但如果只有两个文件并且它们都来自同一个商家,这可能意味着需要大量重新排队。

有什么想法吗?

【问题讨论】:

标签: c# .net queue task-parallel-library tpl-dataflow


【解决方案1】:

您可以创建多个ActionBlocks(尽可能多地并行处理),每个ActionBlocks 一次只处理一个文件,并在文件名中使用数字来选择正确的ActionBlock。这将允许并行处理,同时确保顺序处理具有相同商家 ID 的文件。

初始化:

_actionBlocks = new ActionBlock<File>[DegreeOfParallelism];
for (var i = 0; i < _actionBlocks.Length; i++)
{
    _actionBlocks[i] = new ActionBlock<File>(file => ProcessFile(file));
}

用法:

void ProcessFile(string path)
{
    _actionBlocks[(uint) int.Parse(Path.GetFileNameWithoutExtension(path))%_actionBlocks.Length].Post(
        ReadFile(path));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多