Comunicar y sincronizar procesos concurrentes

Imagen de jesusjn
0 puntos

Hola,

Soy novato en esto de linux. El caso es que tengo que programar una pequeña aplicación que ejecute N procesos de forma concurrente. Cada proceso ejecutará otra aplicación de forma que el resultado que se vaya obteniendo de cada ejecución hay que meterlo en una PIPE (eso he pensado yo para poder hacerlo) en el orden de ejecución.
Es decir, si por ejemplo, se ejecutan 4 procesos que ejecutan 4 archivos cuyos resultados son A,B,C,D. los procesos se ejecutarán concurrentemente y en la pipe se tiene que escribir A,B,C,D independientemente de cuando se vayan acabando los procesos. Si por ejemplo, el proceso que da como resultado la D acaba antes que el proceso que da como resultado la A, no escribirá en la PIPE hasta que no le toque.
Alguna idea de como hacer esto????. Quizás no es la forma de hacerlo con una sola pipe. Es que no se. Agradecería cualquier ayuda, o ejemplos de como tratar esto.
Muchas gracias.

Imagen de Infotny
+1
0
-1

Si usas python yo te recomendaría usar la librería pykiss.fork.

import subprocess
from pykiss import fork

#los comandos que quieres ejecutar y el orden en que quieres las respuestas
comandos = [
	'find | grep py',
	'ls /home',
	'ps',
	'echo tralari'
]

#preparamos sitios para almacenar las respuestas
respuestas = ['']*len(comandos)

#este es el objeto que se encarga de todo
control = fork.Control()

#esta es la función que se ejecutará de forma paralela
#el indice i lo podríamos haber almacenado en la función de callback, con functools.partial, pero así es más fácil y la diferencia en rendimiento es inapreciable
def ejecutar(i, comando):
	return i, subprocess.Popen(comando, stdout=subprocess.PIPE, shell=True).communicate()[0]

#esta es la función de callback que se ejecutará con los valores de retorno
def coger(retorno):
	indice, resultado = retorno
	respuestas[indice]=resultado

#i es para mantener el orden de las respuestas
i=0 
#lanzamos los comandos en paralelo con fork_function
for comando in comandos:
	control.fork_function(
		coger,
		ejecutar,
		i, comando
	)
	i+=1
#esperamos por los valores de retorno y ejecutamos sus callbacks
control.main()

#pintamos las respuestas
print respuestas


Espero que te sirva de ayuda.
Puedes hacerlo manualmente, pero una librería como pykiss.fork te ayudará a que tú código sea más legible/mantenible

pykiss.fork lo puedes descargar en http://es.pykiss.com/public_static_files/dist/pykiss-1.0.tar.gz

+1
0
-1