[Python-es] ayuda con hilos de ejecución

Chema Cortes pych3m4 en gmail.com
Mie Dic 21 19:14:45 CET 2011


El día 21 de diciembre de 2011 03:45, gmail <manuelcortez00 en gmail.com> escribió:

> Buscaré en internet acerca de la programación utilizando este tipo de
> elementos y gracias a todos por su ayuda.

En un rato libre que tenía, te he creado este programa que espero
ilustre algo cómo sería.

He creado una clase "Crono" cuyas instacias serán las que midan el
tiempo, accesibles en multihilo. Los objetos cronos pueden establecer
un "contexto" de ejecución para sentencias 'with' que facilitan la
puesta en marcha y la parada del cronómetro, tal como se ve en el
ejemplo más adelante:

#!/usr/bin/python
#-*- coding: utf-8 -*-

import time
import threading

class Crono(object):

    def __init__(self):

        self.lock=threading.Lock()
        self._reset()

    def _reset(self):

        #reset sin bloqueo previo
        self._lap=0.0
        self._last_time=time.time()

    def reset(self):

        #reset con bloqueo
        locked=self.lock.acquire(False)
        if locked:
                self._reset()
                self.lock.release()
        return locked

    @property
    def seconds(self):

        #devuelve self._lap si no hay bloqueo
        #en caso contrario, calcula el tiempo transcurrido

        if self.lock.acquire(False):
            result=self._lap
            self.lock.release()
        else:
            result=time.time()-self._last_time

        return result

    def __enter__(self):

        self.lock.acquire()
        self._reset()

    def __exit__(self,exc_type, exc_value, traceback):

        self._lap=self.seconds
        self.lock.release()


def contador(maxsegs, crono, evt):

    with crono:
        while crono.seconds<=maxsegs and not evt.is_set():
            evt.wait(.1) #espera de 1 décima de segundo

evt=threading.Event()
crono=Crono()

#Creamos el hilo y lo ejecutamos con 100 segundos como límite del crono
t=threading.Thread(target=contador, kwargs=dict(maxsegs=100,
crono=crono, evt=evt))
t.start()

t.join(2) #esperamos dos segundos y miramos cómo va el cronómetro
print "Han pasado %f segundos"%crono.seconds

t.join(2) #esperamos dos segundos
evt.set() #activamos el evento de terminación

t.join() #esperamos a que termine el hilo hijo

print "Han pasado un total de %f segundos"%crono.seconds













-- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


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