英特尔TBB计算图:如何指定节点的输入队列容量

时间:2017-07-18 09:03:37

标签: c++ tbb tpl-dataflow dataflow tbb-flow-graph

我正在寻找.NET TPL Dataflow库的C ++模拟。

在TPL数据流中,您可以指定并行度和&阻止容量选择。如果块的输入队列的大小达到它的容量,那么相应块的生产者的执行被暂停:

var buffer = new BufferBlock<int>(new DataflowBlockOptions() { BoundedCapacity = 10 });

var producer = new Task(() => { 
    for (int i = 0; i < 1000; i++) {
        buffer.Post(i);
    }
});

var fstAction = new TransformBlock<int, int>(async (i) => {
    return i*i;
}, MaxDegreeOfParallelism = 4, BoundedCapacity = 10);

var sndAction = new ActionBlock<int>(async (i) => {
    Thread.Sleep(5000);
    Console.WriteLine(i);
}, MaxDegreeOfParallelism = 4, BoundedCapacity = 10);

buffer.LinkTo(fstAction, new DataflowLinkOptions() { PropagateCompletion = true });
fstAction.LinkTo(sndAction, new DataflowLinkOptions() { PropagateCompletion = true });

sndAction.Completition.Wait();

我需要在C ++中使用类似的功能。 TBB似乎是一个很好的选择,但我找不到如何在function_node / buffer_node上指定容量。这是一个例子:

std::size_t exportConcurrency = 16;
std::size_t uploadConcurrency = 16;

flow::graph graph;

std::size_t count = 1000;
std::size_t idx = 0;

flow::source_node<std::vector<std::string>> producerNode(graph, [&count, &idx](auto& out) {
    out = { "0"s };
    return ++idx != count;
});

flow::function_node<std::vector<std::string>, std::string> exportNode(graph, exportConcurrency, [](auto& ids) {
    return "0"s;
});

flow::function_node<std::string, std::string> uploadNode(graph, uploadConcurrency, [](auto& chunk) {
    std::this_thread::sleep_for(5s);
    return "0"s;
});

flow::make_edge(producerNode, exportNode);
flow::make_edge(exportNode, uploadNode);

graph.wait_for_all();

1 个答案:

答案 0 :(得分:0)

可以在official docs中找到limiting resource consumption的三种推荐方式,其中一种是using limiter_node

  

限制资源消耗的一种方法是使用limiter_node设置可以流经图表中给定点的消息数的限制。

这不是你想要的确切事情,但仍应该进行调查。我还能够找到concurrent queue classes部分,这些部分可以使用set_capacity方法的有界容量。也许你可以通过这种方式来管理它。希望这会有所帮助。