.NET TPLデータフローライブラリのC++アナログを探しています。インテルTBB計算グラフ:ノードの入力キュー容量を指定する方法
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
です。次に例を示します。limiting resource consumptionの方法をお勧めします、そのうちの一つはusing limiter_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();
TBBフローグラフは、バッファの容量を指定するための直接インタフェースを持っていないようです。しかし、あなたの問題はTBBを使って別々に解決できるかもしれません。いくつかの変種を比較するには、あなたが解決しようとしている問題に関してより多くの情報を提供してください。 – Aleksei