Ho un compito che elabora un elenco di file su stdin. Il tempo di avvio del programma è notevole e il tempo impiegato da ciascun file varia notevolmente. Voglio generare un numero considerevole di questi processi, quindi inviare il lavoro a quelli che non sono occupati. Esistono diversi strumenti a riga di comando che fanno quasi quello che voglio, l'ho ridotto a due opzioni quasi funzionanti:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
Il problema è che split
fa un round-robin puro, quindi uno dei processi rimane indietro e rimane indietro, ritardando il completamento dell'intera operazione; mentre parallel
vuole generare un processo per N righe o byte di input e finisco per dedicare troppo tempo al sovraccarico di avvio.
Esiste qualcosa del genere che riutilizzerà i processi e le linee di alimentazione a qualunque processo abbia stdin sbloccati?
myjob
è pronta a ricevere più input. Non c'è modo di sapere che un programma è pronto per elaborare più input, tutto quello che puoi sapere è che qualche buffer da qualche parte (un buffer pipe, un buffer stdio) è pronto a ricevere più input. Puoi organizzare che il tuo programma invii qualche tipo di richiesta (es. Visualizzare un prompt) quando è pronto?
read
chiamate farebbe il trucco. È uno sforzo di programmazione abbastanza ampio.
-l 1
in parallel
args? IIRC, che dice al parallelo di elaborare una riga di input per lavoro (ovvero un nome file per fork di myjob, quindi un sacco di costi di avvio).
split
comando? Il nome è in conflitto con l' utilità di elaborazione del testo standard .