Ich bin auf der Suche nach C++ Analog der .NET TPL Dataflow-Bibliothek.Intel TBB computational Graph: Wie Eingabe Eingangswarteschlange Kapazität des Knotens
In TPL Dataflow können Sie die Parallelitätsoptionen & Blockkapazität angeben. Wenn die Größe der Eingangswarteschlange des Blocks erreicht ist es Kapazität dann die Ausführung des Herstellers des entsprechenden Blocks aufgehängt ist:
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();
Und ich brauche eine ähnliche Funktionalität in C++. TBB scheint eine gute Wahl zu sein, aber ich kann nicht finden, wie man die Kapazität auf function_node
/buffer_node
spezifiziert. Hier ist ein ein Beispiel:
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();
Es scheint, dass TBB Flow Graph keine direkte Schnittstelle zur Angabe der Pufferkapazität hat. Es könnte jedoch sein, dass Ihr Problem mit TBB anders gelöst werden könnte. Um mehrere Varianten zu wiegen, können Sie bitte weitere Informationen zu dem Problem, das Sie zu lösen versuchen, geben. – Aleksei