У мене є завдання, яке обробляє список файлів на stdin. Час запуску програми є значним, і кількість часу, який займає кожен файл, варіюється в широких межах. Я хочу породити значну кількість цих процесів, а потім диспетчерська робота для тих, хто не зайнятий. Існує кілька різних інструментів командного рядка, які майже роблять те, що я хочу, я звузив його до двох майже працюючих варіантів:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
Проблема полягає в тому, splitщо це чистий кругообіг, тому один з процесів відстає і залишається позаду, затримуючи завершення всієї операції; хоча parallelхоче породжувати один процес на N рядків або байтів введення, і я закінчую витрачати занадто багато часу на стартові накладні витрати.
Чи є щось подібне, яке повторно використовуватиме процеси та лінії подачі для тих, які б процеси не розблокували stdins?
myjobготовий отримати більше вкладів. Немає можливості знати, що програма готова обробити більше вводу, все, що ви можете знати, це те, що десь буфер (буфер труби, буфер stdio) готовий отримати більше вводу. Чи можете ви домовитись, щоб ваша програма надіслала якийсь запит (наприклад, відображає підказку), коли вона готова?
readдзвінки, зробить свою справу. Це досить велике завдання програмування.
-l 1в parallelаргументах? IIRC, який повідомляє паралельно обробляти один рядок введення на роботу (тобто одне ім'я файлу на вилку myjob, так багато накладних накладних витрат).
splitкоманда? Назва суперечить стандартній утиліті для обробки тексту.