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

gmail manuelcortez00 en gmail.com
Mar Dic 20 19:14:34 CET 2011


Hola.

Lo que pasa es que la función la puedes eejecutar sin parámetros o con 
dos parámetros que representan el minuto y la hora hasta la que quieres 
que cuente.

Si se ejecuta sin parámetros, empieza a contar hasta que recibe un 
KeiboardInterrupt, cuando lo recibe, lanza el valor de retorno que es 
una lista con el minuto y la hora que duró contando el tiempo.

Quisiera ver si manteniendo ejecutando el código con el hilo puedo hacer 
que el hilo detenga la función, no sé como, con alguna función stop o 
algo parecido...

Porque si no se detiene no podré saber el valor de retorno de la 
función: el minuto y la hora final que puse en los dos ifs, no recuerdo, 
pero creo que solo el primero me daba errores al momento de llegar a una 
hora o minuto finales, pero el segundo creo que era para una corrección, 
en fin, eso no lo he depurado, pero lo que me interesa en especial es 
saber como debo hacer para que pueda por ejemplo, enviarle desde un 
socket un mensaje que le diga al servidor que ejecute la función y otro 
que cuando la reciba el servidor detenga y regrese el valor de retorno o 
algo así, ya que no puedo hacer que se detenga la función, detengo el 
socket e incluso se desconecta, pero se sigue contando el tiempo y eso 
es lo que no puedo hacer.

Gracias.



El 20/12/11 06:04, G V escribió:
> 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/
> _______________________________________________
> 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