2017-07-18 12 views
0

.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(); 
+0

TBBフローグラフは、バッファの容量を指定するための直接インタフェースを持っていないようです。しかし、あなたの問題はTBBを使って別々に解決できるかもしれません。いくつかの変種を比較するには、あなたが解決しようとしている問題に関してより多くの情報を提供してください。 – Aleksei

答えて

0

一つは、3があること、official docsで見つけることができます:リソースの消費を制限する

一つの方法はにありますlimiter_nodeを使用して、のメッセージ数に制限を設定してください。は、グラフの所定のポイントを流れることができます。

あなたが望む正確なものではありませんが、依然として調査する必要があります。また、私はconcurrent queue classesセクションを見つけることができました。これは、set_capacityメソッドで有界容量で使用できます。多分あなたはそのようにそれを管理することができます。お役に立てれば。

関連する問題