Mam zadanie, które przetwarza listę plików na stdin. Czas uruchamiania programu jest znaczny, a ilość czasu, jaką zajmuje każdy plik, jest bardzo różna. Chcę odrodzić znaczną liczbę tych procesów, a następnie wysłać pracę do tych, które nie są zajęte. Istnieje kilka różnych narzędzi wiersza polecenia, które prawie robią to, co chcę, zawęziłem to do dwóch prawie działających opcji:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
Problem polega na tym, że split
robi czysty round-robin, więc jeden z procesów pozostaje w tyle i pozostaje w tyle, opóźniając zakończenie całej operacji; podczas gdy parallel
chce odrodzić jeden proces na N linii lub bajtów danych wejściowych, a ja spędzam zbyt dużo czasu na narzutach związanych z uruchamianiem.
Czy istnieje coś takiego, który ponownie wykorzysta procesy i linie zasilające do tych procesów, które mają odblokowane standardowe wejścia?
myjob
jest gotowa na otrzymanie większej ilości informacji. Nie ma sposobu, aby wiedzieć, że program jest gotowy do przetworzenia większej ilości danych wejściowych, wszystko, co możesz wiedzieć, to to, że gdzieś bufor (bufor potoku, bufor stdio) jest gotowy na przyjęcie większej ilości danych wejściowych. Czy możesz zorganizować wysyłanie przez program jakiegoś żądania (np. Wyświetlenie monitu), gdy będzie ono gotowe?
read
wywołania, załatwi sprawę . To dość duże przedsięwzięcie programistyczne.
-l 1
w parallel
args? IIRC, który mówi równolegle, aby przetwarzał jeden wiersz danych wejściowych na zadanie (tj. Jedną nazwę pliku na rozwidlenie mojej pracy, więc dużo początkowego obciążenia).
split
polecenie? Nazwa jest w konflikcie ze standardowym narzędziem do przetwarzania tekstu.