[Python-es] ayuda con hilos de ejecución
Eduard Diaz
eventgrafic en gmail.com
Mar Dic 20 20:31:15 CET 2011
Has buscado en google por "python stop kill a thread running" (sin comillas)
He encontrado esto, no se si te será útil pero para el hilo a partir de un
evento de teclado:
http://www.python-forum.org/pythonforum/viewtopic.php?f=1&t=11016#p50657
Un saludo
El 20 de diciembre de 2011 19:14, gmail <manuelcortez00 en gmail.com> escribió:
> 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<http://mail.python.org/mailman/listinfo/python-es>
>>> FAQ: http://python-es-faq.wikidot.**com/<http://python-es-faq.wikidot.com/>
>>>
>> ______________________________**_________________
>> Python-es mailing list
>> Python-es en python.org
>> http://mail.python.org/**mailman/listinfo/python-es<http://mail.python.org/mailman/listinfo/python-es>
>> FAQ: http://python-es-faq.wikidot.**com/<http://python-es-faq.wikidot.com/>
>>
>
> ______________________________**_________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/**mailman/listinfo/python-es<http://mail.python.org/mailman/listinfo/python-es>
> FAQ: http://python-es-faq.wikidot.**com/<http://python-es-faq.wikidot.com/>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20111220/0b50746b/attachment.html>
Más información sobre la lista de distribución Python-es