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

G V nadaird en gmail.com
Mar Dic 20 13:04:09 CET 2011


no termino de entender qué es lo que quieres hacer, cuando pararía de
contar el servidor? cuando llega a minutofinal? no pongas entonces el
== sino >=, ya que si se hubiera pasado, seguiria contando (quizás sea
lo que te pase)
y en vez de contar tú, porque no usas datetime.now() al inicio y al
terminar y los restas o alguna otra solución similar?

Ademas en:
if minuto_final > 0 and min == minuto_final:
               print "tu tiempo terminó, gracias por tu preferencia"
               exit()
if hora_final > 0 and hora == hora_final and min == minuto_final:
               print "tu tiempo terminó, gracias por tu preferencia"
               exit()

el segundo if sobra, porque está contenido en el primero, por lo que
siempre saltara en el primer if y nunca en el segundo.

2011/12/20 gmail <manuelcortez00 en gmail.com>:
> Saludos a todos, primero que nada quisiera agradecer por permitirme entrar a
> formar parte de la lista.
>
> Quisiera ver si les será posible hecharme una mano con esto.
>
> Lo que pasa es que estoy programando dos aplicaciones, o una aplicación
> cliente/servidor que se comunica mediante sockets.
>
> El lío es que en el servidor he utilizado la clase threading.thread para
> hacer que el programa pueda atender múltiples clientes al mismo tiempo, y he
> ahí donde nace la complicación.
>
> Una de las funciones del programa es que cuando reciba la palabra libre,
> ejecute una función que se encarga de contar los segundos de uno en uno, la
> función arroja como retorno a una variable el total del tiempo que ha
> transcurrido, pero con los hilos de ejecución(se encuentra dentro del método
> run de la clase) no consigo como hacer, ya que al recibir la palabra libre,
> se ejecuta el conteo, pero no puedo hacer que se detenga y mucho menos que
> muestre cual fue el total del tiempo, se detiene la conexión al socket, pero
> sigue contando el tiempo.
>
> La función que cuenta el tiempo es esta:
>    def libre(self, hora_final=0, minuto_final=0):
>        #comprobamos que la variable minuto_final no tenga un valor igual o
> arriba de 60
>        if minuto_final > 59:
>            #si la tiene, hacemos que el nuevo valor de hora_final se cambie
> por el que salga del resultado de sumar la hora final que se tiene
> actualmente más el número que sale al dividir los minutos entre 60 para
> formar una hora, su resultado es una división entera y sobrarán números.
>            hora_final = hora_final+minuto_final/60
>            #aquí hacemos que lo que sobre de la división anterior se asigne
> a los minutos, para no perder más tiempo.
>            minuto_final = minuto_final%60
>
>        #se asignan 3 variables a 0, para ir incrementándolas comforme avance
> el tiempo.
>        seg = min = hora = 0
>        while True:
>            #cada repetición del bucle sumará 1 a la variable seg, dando el
> efecto de avanzar en los segundos.
>            seg = seg+1
>            #como no se puede tener más de 60 segundos, se comprueba que seg
> no valga más que 59.
>            if seg > 59:
>                #cuando seg valga 60, se dividirá entre 60, lo cual dará un
> resultado de 1 y sumándolo al contador de minutos.
>                min = min+seg/60
>                #se stablece el contador de segundos de nuevo a 0 para
> reinicializar el proceso.
>                seg = 0
>            #se hace lo mismo con los minutos, pero ahora añadiendo el valor
> a horas en las siguientes 3 líneas.
>            if min > 59:
>                hora = hora+min/60
>                min = 0
>            #se muestra el resultado al usuario.
>            print "%i:%i:%i" % (hora, min, seg)
>            retorno =+hora, min
>
>            if minuto_final == 0:
>                pass
>            if hora_final == 0:
>                pass
>            if minuto_final > 0 and min == minuto_final:
>                print "tu tiempo terminó, gracias por tu preferencia"
>                exit()
>            if hora_final > 0 and hora == hora_final and min == minuto_final:
>                print "tu tiempo terminó, gracias por tu preferencia"
>                exit()
>            try:
>                time.sleep(1)
>            except KeyboardInterrupt:
>                return retorno
>
> Esta función espera a que se le pasen dos argumentos, horas máximas y
> minútos máximos a contar, si no se pasan argumentos, contará de forma
> infinita hasta que se le detenga.
>
> Y aquí está la forma de implementarla en el servidor, la función de conteo
> se encuentra en una clase llamada contador:
> from threading import Thread
>
> pc = contador.contador()
> #Clase con el hilo para atender a los clientes.
> #En el constructor recibe el socket con el cliente y los datos del
> #cliente para escribir por pantalla
> class Cliente(Thread):
>    def __init__(self, socket_cliente, datos_cliente):
>        Thread.__init__(self)
>        self.socket = socket_cliente
>        self.datos = datos_cliente
>    # Bucle para atender al cliente.
>    def run(self):
>        # Bucle indefinido hasta que el cliente envie "adios"
>        activo = True
>        while activo:
>            # Espera por datos
>            peticion = self.socket.recv(1024)
>            # Contestacion a "libre"
>            if peticion == "libre":
>                print str(self.datos)+ " pide tiempo libre:"
>                var = pc.libre()
>                self.socket.send("libre")
> ...
> if __name__ == '__main__':
>    # Se prepara el servidor
>    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>    server.bind(("", 8000))
>    server.listen(1)
>    print "Esperando clientes..."
>
>    # bucle para atender clientes
>    while 1:
>        # Se espera a un cliente
>        socket_cliente, datos_cliente = server.accept()
>        # Se escribe su informacion
>        print "conectado "+str(datos_cliente)
>
>        # Se crea la clase con el hilo y se arranca.
>        hilo = Cliente(socket_cliente, datos_cliente)
>        hilo.stop()
>
>
> Me podríais ayudar? quisiera poder o detener el hilo de ejecución para sacar
> el valor de retorno o encontrar una manera de parar todo lo que se esté
> haciendo y saber cuanto se usó de tiempo.
>
> saludos y gracias.
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/


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