2013-03-08 14 views
5

Szukałem biblioteki potokowej do ponownego uruchamiania w C++ (biblioteka programu do planowania zadań?). Nie mogłem znaleźć niczego w ramach Boost. Więc w końcu dowiedział się dwóch kandydatów:Biblioteka C++ do budowania potoku wykonawczego

jestem brakuje żadnych innych kandydatów? Czy ktoś ich użył? Jak dobre są one w odniesieniu do równoległego io i wielowątkowości? W tych bibliotekach nadal brakuje obsługi zależności. Na przykład nie wydaje się dla mnie jasne, w jaki sposób można by napisać coś takiego:

$ cat /dev/urandom | tr P Q | head -3 

W tym bardzo prostym przypadku, rurociąg podszedł dołu do góry, a pierwsze cat przystanki wykonywania kiedy head proces zatrzymuje ciągnięcia.

Jednak nie widzę w jaki sposób mogę korzystać z wielowątkowości i czy równoległą IO w przypadku takim jak:

$ cat /raid1/file1 /raid2/file2 | tr P Q > /tmp/file3 

Nie ma dla mnie sposób, aby powiedzieć: wykonać tr na 7 wątki gdy 8 procesorów dostępny.

+0

myślę, że jesteś mylące coś: rurociągi nie oznacza automatycznie, że poszczególne etapy * * w rurociągu są paralleliseable (jak Twój przykład pokazuje), to po prostu oznacza, że wszystkie (lub niektóre) kroki mogą być wykonywane równolegle, a dane sondowania/wypychania między sobą. –

+1

Chciałbym dalej eksplorować biblioteki współdziałania google. Zaproponowano, aby stać się częścią standardu C++. Więcej tutaj http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3534.html # Solution –

Odpowiedz

3

Czego oczekujesz to framework Dataflow. Pipeline to wyspecjalizowana forma przepływu danych, w której wszystkie komponenty mają 1 konsumenta i 1 producenta.

Zwiększ obsługuje przepływ danych, ale niestety nie jestem zaznajomiony z Boost. Oto link: http://dancinghacker.com/code/dataflow/dataflow/introduction/dataflow.html

W każdym razie powinieneś pisać swoje komponenty jako osobne programy i używać uniksowych potoków. Szczególnie, jeśli twoja charakterystyka danych jest (lub może być łatwo przekształcona) w linie/tekst.

Można również napisać własną rzecz przepływu danych. Nie jest to zbyt trudne, szczególnie, gdy masz ograniczenia (mam na myśli potok: 1-konsument/1-producent), nie powinieneś implementować pełnej struktury przepływu danych. Piping polega właśnie na wiązaniu pewnych funkcji, przekazując wynik do następnego argumentu. Struktura przepływu danych dotyczy interfejsu/wzorca komponentu i techniki wiązania. (Jest fajnie, napisałem jeden.)

+2

boost :: dataflow to propozycja, która nie została zaakceptowana do zwiększenia. – rhashimoto

2

Właśnie przeczytałem dzisiaj o RaftLib, który wykorzystuje szablony i klasy do tworzenia elementów potoku o nazwie "jądra". Pozwala na szeregowy potok, taki jak pokazany przykład Bash, oprócz równoległych przepływów danych. Z Hello world example na pierwszej stronie:

#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); 
}