Я искал повторно используемую библиотеку конвейера выполнения в C ++ (библиотека планировщика заданий?). Я не мог ничего найти внутри Увеличение. В итоге я обнаружил двух кандидатов:
Я скучаю по другим кандидатам? Кто-нибудь их использовал? Насколько они хороши в отношении параллельного ввода-вывода и многопоточности?
В этих библиотеках по-прежнему отсутствует обработка зависимостей. Например, мне не ясно, как можно написать что-то вроде:
$ cat /dev/urandom | tr P Q | head -3
В этом очень простом случае трубопровод идет снизу вверх, а первый cat
прекращает выполнение, когда head
процесс перестает тянуть.
Однако я не понимаю, как я могу извлечь выгоду из многопоточности или параллельного ввода-вывода в таких случаях, как:
$ cat /raid1/file1 /raid2/file2 | tr P Q > /tmp/file3
Я не могу сказать: выполнить tr
на 7 потоков, когда доступно 8 процессоров.
Что вы ищете, так это поток данных фреймворк. Конвейер — это специализированная форма потока данных, где все компоненты имеют 1 потребителя и 1 производителя.
Boost поддерживает поток данных, но, к сожалению, я не знаком с Boost. Вот ссылка: http://dancinghacker.com/code/dataflow/dataflow/introduction/dataflow.html
В любом случае, вы должны писать свои компоненты как отдельные программы и использовать каналы Unix. Особенно, если ваша характеристика данных является (или может быть легко преобразована в) строками / текстом.
Также можно написать свой собственный поток данных. Это не так уж сложно, особенно когда у вас есть ограничения (я имею в виду трубу: 1-потребитель / 1-производитель), вы не должны реализовывать полную структуру потока данных. Трубопровод — это просто связывание некоторых функций вместе, передача результата в аргумент следующего. Структура потока данных о компонентном интерфейсе / шаблоне и технике привязки. (Это весело, я написал один.)
Я только что прочитал сегодня о RaftLib, который использует шаблоны и классы для создания элементов конвейера, называемых «ядрами». Он допускает последовательный конвейер, такой как пример Bash, который вы показали, в дополнение к параллельным потокам данных. От Привет мир пример на первой странице:
#include <raft>
#include <raftio>
#include <cstdlib>
#include <string>
class hi : public raft::kernel
{
public:
hi() : raft::kernel()
{
output.addPort< std::string >( "0" );
}
virtual raft::kstatus run()
{
output[ "0" ].push( std::string( "Hello World\n" ) );
return( raft::stop );
}
};int
main( int argc, char **argv )
{
/** instantiate print kernel **/
raft::print< std::string > p;
/** instantiate hello world kernel **/
hi hello;
/** make a map object **/
raft::map m;
/** add kernels to map, both hello and p are executed concurrently **/
m += hello >> p;
/** execute the map **/
m.exe();
return( EXIT_SUCCESS );
}
Я бы дал Threading Building Blocks http://threadingbuildingblocks.org/ попытка
Это открытый исходный код и кросс-платформенный. Статья в Википедии довольно хороша: http://en.wikipedia.org/wiki/Intel_Threading_Building_Blocks