У меня есть задача, которая обрабатывает список файлов на стандартный ввод. Время запуска программы является значительным, и количество времени, которое занимает каждый файл, варьируется в широких пределах. Я хочу порождать значительное количество этих процессов, а затем отправлять работу тем, кто не занят. Есть несколько различных инструментов командной строки, которые почти делают то, что я хочу, я сузил это до двух почти работающих вариантов:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
Проблема заключается в том, что splitвыполняется чистый циклический перебор, поэтому один из процессов отстает и остается позади, задерживая завершение всей операции; while parallelхочет порождать один процесс на N строк или байтов ввода, и я трачу слишком много времени на издержки запуска.
Есть ли что-то подобное, что будет повторно использовать процессы и линии подачи для тех процессов, которые имеют разблокированные stdins?
myjobготов получить больше информации. Нет никакого способа узнать, что программа готова обрабатывать больше входных данных, все, что вы можете знать, это то, что некоторый буфер где-то (буфер канала, буфер stdio) готов получить больше ввода. Можете ли вы сделать так, чтобы ваша программа отправила какой-то запрос (например, отобразить подсказку), когда она будет готова?
readвызовы, сделает свое дело. Это довольно большое программирование.
-l 1в parallelargs? IIRC, который указывает параллельно обрабатывать одну строку ввода на задание (то есть одно имя файла на разветвление myjob, поэтому много накладных расходов при запуске).
splitкоманда? Имя конфликтует со стандартной утилитой обработки текста.