Хорошо, я бежал POV-Ray на всех демонстрационных версиях, но POV все еще однопоточный и не использовал бы более одного ядра. Итак, я начал думать о решении в BASH.Многопоточное программирование BASH - обобщенный метод?
Я написал общую функцию, которая принимает список команд и запускает их в указанном числе подклассов. Это на самом деле работает, но мне не нравится, как она обрабатывает доступ к следующей команде в
поточно-
многопроцессной пути:
- Он принимает в качестве аргумента, файл с командами (1 в каждой строке),
- Чтобы получить команду "рядом", каждый процесс ("нить") будет:
- Ждет, пока он не может создать файл блокировки, с: пер $ CMDFILE $ LockFile
- Прочтите команду m файл,
- Изменяет $ CMDFILE, удаляя первую строку,
- Удаляет $ LOCKFILE.
Есть уборщик способ сделать это? Я не мог заставить суб-оболочки правильно читать одну строку из FIFO.
Кстати, Целью этого является улучшение того, что я могу сделать в командной строке BASH, а не для поиска решений без bash. Я стараюсь выполнять множество сложных задач из командной строки и хочу использовать еще один инструмент в панели инструментов.
Между тем, вот функция, которая обрабатывает получение следующей строки из файла. Как вы можете видеть, он изменяет файл на диске каждый раз, когда он читает/удаляет строку. Это то, что кажется хакерским, но я не придумал ничего лучшего, так как FIFO не работал без setvbuf() в bash.
#
# Get/remove the first line from FILE, using LOCK as a semaphore (with
# short sleep for collisions). Returns the text on standard output,
# returns zero on success, non-zero when file is empty.
#
parallel__nextLine()
{
local line rest file=$1 lock=$2
# Wait for lock...
until ln "${file}" "${lock}" 2>/dev/null
do sleep 1
[ -s "${file}" ] || return $?
done
# Open, read one "line" save "rest" back to the file:
exec 3<"$file"
read line <&3 ; rest=$(cat<&3)
exec 3<&-
# After last line, make sure file is empty:
([ -z "$rest" ] || echo "$rest") > "${file}"
# Remove lock and 'return' the line read:
rm -f "${lock}"
[ -n "$line" ] && echo "$line"
}
Оставьте свой код! –
Посмотрите на 'lockfile-progs (1)', чтобы узнать, есть ли какая-либо помощь. Проблема с FIFO может быть связана с буферизацией. Некоторые утилиты имеют небуферизованный режим. –