Вычислительный график Intel TBB: как указать емкость входной очереди узла

Я ищу C ++ аналог библиотеки .NET TPL Dataflow.

В TPL Dataflow вы можете указать параллелизм & Варианты вместимости блоков. Если размер входной очереди блока достигает своей емкости, выполнение производителя соответствующего блока приостанавливается:

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();

0

Решение

Можно найти в официальные документы, что есть три рекомендуемых способа ограничение потребления ресурсов, и один из них с помощью limiter_node:

Одним из способов ограничения потребления ресурсов является использование limiter_node установить ограничение на количество сообщений которые могут течь через заданную точку на вашем графике.

Это не та вещь, которую вы хотите, но все же должны расследовать. Также мне удалось найти параллельные классы очереди секции, которые могут быть использованы с ограниченной емкостью с set_capacity метод. Может быть, вы можете справиться с этим. Надеюсь это поможет.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector