У меня есть задача, которая обрабатывает список файлов на стандартный ввод. Время запуска программы является значительным, и количество времени, которое занимает каждый файл, варьируется в широких пределах. Я хочу порождать значительное количество этих процессов, а затем отправлять работу тем, кто не занят. Есть несколько различных инструментов командной строки, которые почти делают то, что я хочу, я сузил это до двух почти работающих вариантов:
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
в parallel
args? IIRC, который указывает параллельно обрабатывать одну строку ввода на задание (то есть одно имя файла на разветвление myjob, поэтому много накладных расходов при запуске).
split
команда? Имя конфликтует со стандартной утилитой обработки текста.