paralelizador de tareas

Temas sobre proyectos de código abierto, su promoción, ayuda y todo lo necesario para mantenerlo trabajando.
Responder
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

paralelizador de tareas

Mensaje por akodo »

Pues les presento un pequeño código para realizar tareas en paralelo. El código es muy simple y seguro que contendrá fallos, aunque ejecutándolo felizmente da sus resultados.

Este es el código:

Código: Seleccionar todo

#!/usr/bin/env python
import sys
import string
import subprocess
import shlex

def process(p,par):
	list = shlex.split(p)
	fich_salida = None

	try:
		indice = list.index(">")
		fich_salida_nombre = list[indice + 1]
		fich_salida = open(fich_salida_nombre,"w+")
		del list[indice]	#borra >
		del list[indice]	#borra fichero
	except ValueError:
		try:
			indice = list.index(">>")
			fich_salida_nombre = list[indice + 1]
			fich_salida = open(fich_salida_nombre,"a+")
			del list[indice]	#borra >>
			del list[indice]	#borra fichero
		except ValueError:
			fich_salida = None

	subp = None
	if par == False:
		if fich_salida != None:
			retcode = subprocess.call(list,stdout=fich_salida)
		else:
			retcode = subprocess.call(list)
	else:
		if fich_salida != None:
			subp = subprocess.Popen(list,stdout=fich_salida)
		else:
			subp = subprocess.Popen(list)
	return subp

args = sys.argv
if len(args) == 2:
	print args[1]
else:
	print "paralelizer <fich>"
	sys.exit()

f = open(args[1],"r")
list_process = []

for line in f:
	if line == "[start]\n" or line == "[end]\n":
		paralel = False
	elif line == "[paralel]\n":
		paralel = True
	else:
		proc = process(line,paralel)
		if paralel == True:
			list_process.append(proc)

	if paralel == False and len(list_process) > 0:
		for item in list_process[:]:
			item.wait()
		list_process = []
La manera de ejecutarlo es tan simple como "./paralelizer <fichero.txt>" donde el fichero tiene una estructura como la que sigue:

Código: Seleccionar todo

[start]
<comandos>
[paralel]
<comandos>
[end]
<comandos>
Un ejemplo de fichero puede ser el siguiente:

Código: Seleccionar todo

[start]
[paralel]
find . -name "*.png" > p1.txt
find /usr/share -name "*.png" > p2.txt
[end]
cat p1.txt p2.txt > p.txt
rm p1.txt p2.txt
El fichero empieza con la etiqueta "[start]" indicando lo comandos que se ejecutarán al empezar. Luego viene la etiqueta "[paralel]" indicando los comandos que se ejecutarán en paralelo. Finalmente la etiqueta "[end]" indica los comandos que se ejecutarán cuando hayan acabado todos los comando indicados en la etiqueta [paralel]

Los comandos del fichero intentan ser lo más parecido a los comandos bash, aunque hay algunas excepciones, como por ejemplo las redirecciones (sólo están soportadas las de salida, y bajo restrucciones), y las tuberías. Tampoco están soportados los comandos interactivos (más bien, se desconoce su comportamiento).

Razones para utilizar este programa:
1) permite ejecutar fácilmente comandos asegurando (si no hay problemas) que hayan acabado otros comandos, o una serie de ellos (los de la etiqueta "[paralel]")
2) puede mejorar el rendimiento de tareas en ordenadores con varios procesadores (*)

(*) Con el fichero de ejemplo que he puesto y el comando "time" para medir el tiempo, se ha tardado una media de 0.57 segundos (con contenido cacheado) ejecutando un comando equivalente ("find . /usr/share -name "*.png" > p.txt") se ha tardado una media de 0.84 segundos (también con contenido cacheado). Esto en un ordenador de doble núcleo.

Si alguien quiere subir el archivo a su blog, sitio web, etc, es perfectamente libre de hacerlo, para eso está puesto. También pueden mejorar el código si así lo desean.

Un saludo y usen el programa :)
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])

Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: paralelizador de tareas

Mensaje por mcun »

lo voy a probar gracias akodo
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809

Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1908
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: paralelizador de tareas

Mensaje por hipersayan_x »

Felicitaciones! veo que le has dado duro al python :wink:
Ideal para descargar archivos de mediafire con wget.
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net

Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: paralelizador de tareas

Mensaje por akodo »

hipersayan_x escribió:Felicitaciones! veo que le has dado duro al python :wink:
Tan sólo estaba jugando con redirecciones de entrada-salida de programas desde python.
También era para venderlo mejor: un programa pequeño como éste, o lo haces en c/c++ o lo haces en python, más que nada porque no creo que merezca la pena instalarse un compilador/intérprete de ruby por ejemplo, para ejecutar el programa.

Aprovechando lo del wget, pues puedes utilizar un fichero de entrada como el siguiente:

Código: Seleccionar todo

[start]
notify-send "Empezando las descargas"
[paralel]
wget .....
wget .....
.....
[end]
notify-send "Descargas finalizadas" "Todas las descargas han finalizado"
Necesitas el ejecutable "notify-send" para enviar notificaciones de escritorio (creo que el paquete es libnotify-bin, o algo así, al menos en Ubuntu y presumiblemente en Debian), y así cuando se acaben las descargas te aparecerá el mensaje correspondiente.
Es una de las múltiples utilidades que se le puede sacar al programa.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje