Programación BASH multihilo: ¿método generalizado?

Ok yo estaba corriendoPOV-Ray en todas las demostraciones, pero el POV aún es de un solo hilo y no utilizará más de un núcleo. Entonces, comencé a pensar en una solución en BASH.

Escribí una función general que toma una lista de comandos y los ejecuta en el número designado de sub-shells. Esto realmente funciona pero no me gusta la forma en que maneja el acceso al siguiente comando en una salvo de amenazas multiproceso camino:

Toma, como argumento, un archivo con comandos (1 por línea),Para obtener el comando "siguiente", cada proceso ("hilo") hará lo siguiente:Espera hasta que pueda crear un archivo de bloqueo, con:ln $ CMDFILE $ LOCKFILELee el comando del archivo,Modifica $ CMDFILE eliminando la primera línea,Elimina el $ LOCKFILE.

¿Hay una forma más limpia de hacer esto? No pude conseguir que las sub-carcasas leyeran correctamente una sola línea de un FIFO.

De paso,el objetivo de esto es mejorar lo que puedo hacer en una línea de comandos BASH, y no para encontrar soluciones no bash. Tiendo a realizar muchas tareas complicadas desde la línea de comandos y quiero otra herramienta en la caja de herramientas.

Mientras tanto, aquí está la función que se encarga de obtener la siguiente línea del archivo. Como puede ver, modifica un archivo en el disco cada vez que lee / elimina una línea. Eso es lo que parece un error, pero no creo nada mejor, ya que los FIFO no funcionaron sinsetvbuf () en 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"
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta