Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Proyectos


Nuevo tema Responder al tema
 [ 4 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1360
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Mar Abr 27, 2010 11:27 am 
Arriba  
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:
#!/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:
[start]
<comandos>
[paralel]
<comandos>
[end]
<comandos>


Un ejemplo de fichero puede ser el siguiente:
Código:
[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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Dom Abr 18, 2010 4:30 pm
Mensajes: 2728
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)

Nota Publicado: Mar Abr 27, 2010 3:33 pm 
Arriba  
lo voy a probar gracias akodo

_________________
... reinstalar un SO cuando produce un error es como tirar un bebe a la basura cuando se hace caca..

Trusted Network and Developer | Reglamento General de los Foros |WIKI-EL | Twitter @SISIAM
Debian| ArchLinux |Linux User #508809

 Perfil WWW  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Jue Abr 26, 2007 11:00 pm
Mensajes: 1421

Nota Publicado: Mar Abr 27, 2010 6:48 pm 
Arriba  
Felicitaciones! veo que le has dado duro al python :wink:
Ideal para descargar archivos de mediafire con wget.

_________________
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."

"Finibus Bonorum Et Malorum", Cicerón

 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1360
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Mié Abr 28, 2010 3:01 am 
Arriba  
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:
[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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 4 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO