Długotrwałe kolejki priorytetowe

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
alojzikftp
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 09 mar 2011, 20:17
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: Brak
Architektura: x86

Długotrwałe kolejki priorytetowe

Post autor: alojzikftp »

Cześć
Piszę program, który ma zawierać dwie kolejki priorytetowe. Ma być szybki, bo przetwarza duże ilości danych, a także kolejki muszą być sprawne przez wiele godzin - użytkownicy będą podawali dane na stronie WWW, i te dane mogą na tej kolejce trochę czekać.

Pierwszym pomysłem jest C++ i po prostu program zatrzyma się czekając na dalsze dane, tylko że nie wiem, jak z poziomu PHP "podłączyć" się do programu, podać mu dane i się rozłączyć.
Drugim pomysłem jest zastosowanie kolejek linuxowych (jeśli istnieją :)). Tylko że tu pojawia się problem przeciążenia operatora itp.
Więc pytania:
1. Jak Wy byście to zrobili
2. Jak podawać dane do pracującego programu z PHP, albo czegoś innego. (Po prostu dane ze strony WWW wepchnąć na kolejki).
3. Czy istnieją kolejki w systemie, albo jakiś program, ale zależy mi na czymś stabilnym.

Mam nadzieję że ktoś zrozumie i pozrawiam
Awatar użytkownika
JSokol
Sędziwy Jeż
Sędziwy Jeż
Posty: 67
Rejestracja: 18 mar 2010, 10:57
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: Unity
Architektura: x86_64
Lokalizacja: Down under
Kontakt:

Re: Długotrwałe kolejki priorytetowe

Post autor: JSokol »

Chodzi Ci o coś w stylu "X użytkowników zleca Y zleceń które mają się kolejno wykonywać" - czy dobrze rozumiem?
Tego typu problem możesz rozwiązać tak, że "zadania" będą przekazywane do wybranego katalogu w formie odpowiednio spreparowanego XMLa, a w tle będzie chodził sobie programik napisany w C++, który będzie sprawdzał czy są zadania w katalogu, jeśli tak to bierze pierwsze z góry do wykonania i po wykonaniu znów sprawdza czy są jeszcze jakieś, jeśli nie ma żadnych, to usypia się na określony czas i potem ponawia sprawdzenia.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Długotrwałe kolejki priorytetowe

Post autor: ethanak »

kolejki systemowe raczej tu się nie sprawdzą z uwagi na niewielką pojemność. ja bym to zrobił na jakiejś bazie danych gdzie skrypt w php pcha dane do bazy, a jakiś program to sobie cyklicznie czyta. sygnalizację nowych danych można zrobić choćby przez kill albo jakieś sockety (nie wiem czy php obsługuje abstract unix sockets, ale to by było najbezpieczniejsze rozwiązanie).
tloszabno
Piegowaty Guziec
Piegowaty Guziec
Posty: 24
Rejestracja: 19 sie 2006, 13:53
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Re: Długotrwałe kolejki priorytetowe

Post autor: tloszabno »

Możesz użyć pod C++ socketów ( bsd ) i normalnie nasłuchiwać na jakiś "swoim" porcie na jakieś żądanie. Myślę, że z poziomy php się do tego wtedy spokojnie dostaniesz.
alojzikftp
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 09 mar 2011, 20:17
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: Brak
Architektura: x86

Re: Długotrwałe kolejki priorytetowe

Post autor: alojzikftp »

Dzięki za odpowiedzi.
Dobrze mnie zrozumieliście. Bazę danych, pliki i sockety brałem pod rozwagę. Przymierzałem się do socketów C++, ale w sumie to dość trudne jeśli nie miałem z tym styczności wcześniej.
Znalazłem jednak coś takiego jak named pipe.

Kod: Zaznacz cały

int main()
{
        int pipe = open("pipe", O_RDONLY);
        char buffer[SIZE];
        for(int i=0;i<SIZE;i++)
        {
                buffer[i] = '\0';
        }
        read(pipe, buffer, SIZE);
        cout << buffer;
}
i tworzę sobie w bashu

Kod: Zaznacz cały

mkfifo pipe
To tak dla przykładu jak czytać, a w PHP po prostu użyje system(echo "text" > pipe). Wiecie jak to zrobić ładniej, bez wstawiania '\0', bo inaczej zostaje tam jakiś syf, a nie wiadomo jaka będzie dokładnie długość wejścia?

Bałem się czy pipe nie będzie przypadkiem mieszał danych od dwóch różnych userów wykonujących żądanie jednocześnie, ale
One Linux pipe(7) man page says that pipe capacity is 65536 bytes since Linux 2.6.11 and a single system page prior to that (e.g. 4096 bytes on (32-bit) x86 systems).
wydaje mi się więc, że przesłanie krótkiego komunikatu spokojnie zmieści się w 4096 bajtach strony i nie pomiesza, zgadzacie się?
Pozdrawiam
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Długotrwałe kolejki priorytetowe

Post autor: ethanak »

Ej, czekaj - bo jeśli to są krótkie komunikaty to spokojnie możesz użyć IPC... tyle że jeśli sockety są dla Ciebie za trudne to IPC tym bardziej ;)
Pipy mają te brzydkie właściwości, że się blokują kiedy druga strona sobie gdzieś pójdzie. Radzę jednak poczytać o socketach (man socket, man bind, man listen, man accept) bo to Ci się na 100% w życiu przyda.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości