У мене є завдання, яке обробляє список файлів на 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
команда? Назва суперечить стандартній утиліті для обробки тексту.