LA LISTA y Python 2.2

Chema Cortés py en ch3m4.org
Vie Dic 30 02:30:30 CET 2005


El Jueves, 29 de Diciembre de 2005 22:01, FERNANDO VILLARROEL escribió:
> Hola lo primero hay problemas con la Lista parece?

No sé a qué problemas te refieres. Últimamente parece que ha ido bastante 
bien.


> Lo segundo estoy desarrollando en un viejo Red Hat 9,
> esto ya que debo simular el entorno de produccon de un
> cliente que usa esta plataforma, asi que no me queda
> otra. Asi que no me pidan que cambie de plataforma a
> Debian o algo mejor, no puedo por que es lo que hay.
> Mi problema es que esta version de Red Hat la 9, viene
> con Python 2.2.2 y me encontre con la mala noticia que
> no trae el modulo datetime, pero si el modulo time.
>
> Lo que pasa es que necesito trabajar con los tiempos;
> es decir capturar la hora en que se inicia un proceso
> y luego capturar el momento en que finalizo, para
> finalmente saber cuanto duro el proceso:
> con date time seria algo asi
>
> a=datetime.now()
> ....procesos....
> b=datetime.now()
> duracion=b-a

El módulo 'datetime' hay que verlo más bien como el intento de implementar un 
tipo de dato "fecha" en python. Todo la operatividad se consigue igual con el 
módulo 'time', por lo que no te preocupe utilizar esta versión de python.

El módulo time hace todos sus cómputos de tiempos en segundos transcurridos 
desde el 1 de enero de 1970 (origen de tiempos). Calcular el tiempo 
transcurrido entre dos eventos es calcular el número de segundos 
transcurridos (considerando las fracciones de segundo):

a=time.time()
...procesos...
b=time.time()
duracion=b-a

horas=duracion/60.0/60.0

> Alguien tiene ejemplos de aritmeticas con horas en
> python, por ejemplo decirle a python que cada 20
> segundos mande un mensaje?
>
> Como lo puedo hacer con Python 2.2


Hay dos opciones triviales, y una más sofisticada:

1) hacer que el proceso se pare en periodos fijado (time.sleep)
2) crear un bucle que chequee el tiempo y lance el mensaje en el momento 
apropiado

La solución 1) es poco interesante, ya que el programa se para sin hacer nada 
más. La 2) requiere más elaboración, pero permite seguir trabajando hasta que 
se cumple el evento.

La solución 3) sería lanzar varios procesos en multihilo o, ya que usas linux, 
como forks. Un ejemplo sencillo (sin usar el módulo 'threading' de python 
2.4):

import thread, time

onexit=thread.allocate_lock()

#"hilo" informativo
def infothread(onexit):
  t0=time.time()
  while not onexit.locked():
    t=time.time()
    print "Han pasado %d segundos"%(t-t0)
    time.sleep(20)
  print "En total han pasado %d segundos"%(time.time()-t0)
  onexit.release() #se da por enterado

#Lanzamos el hilo informativo
thread.start_new_thread(infothread,(onexit,))

#...proceso...
raw_input()

#avisamos al otro hilo que pare...y esperamos
onexit.acquire()
while onexit.locked():
  pass




Más información sobre la lista de distribución Python-es