[Python-es] Un "timeout" usando decoradores me funciona con funciones (no pun intended), pero no con métodos
Ricardo Cárdenes
ricardo.cardenes en gmail.com
Mar Dic 5 00:56:42 EST 2017
Buenas...
Pues no sé cómo te funciona el primero. Observa:
p = multiprocessing.Process(target=f(*k, **kw))
Aquí estás invocando la función y esperando a que devuelva un valor. Eso
debería ser...
p = multiprocessing.Process(target=f, args=k, kwargs=kw)
En esas condiciones me funcionan (no pun intended) tanto la función como el
método
2017-12-04 16:27 GMT-10:00 Jose Caballero <jcaballero.hep en gmail.com>:
> Hola,
>
> Éste código funciona bien (*).
> Consigo pasar un valor de "timeout' como parámetro del decorador, y la
> función se aborta si se sobrepasa el límite de tiempo.
>
> Sin embargo, si intento hacer lo mismo con un método en lugar de una
> función (**), el valor de "timeout' no parece que se tenga en cuenta
> en p.join().
> Siempre se ejecuta el método hasta el final.
>
> ¿Qué me está faltando?
>
> Bonus question: ¿hay alguna forma de recuperar el output de la función
> "funct", si tuviese un return? Con subprocess.Popen() se puede hacer
> p.communicate(), pero no veo en la documentación como hacer algo
> parecido con multiprocessing.Process()
>
> Muchas gracias por adelantado.
> Jose
>
> -------------------------------------------------------------
>
> (*)
>
> import multiprocessing
> import time
>
>
> def Timeout(timeout):
> def realdecorator(f):
> def wrapper(*k, **kw):
> p = multiprocessing.Process(target=f(*k, **kw))
> p.start()
> p.join(timeout)
> if p.is_alive():
> print('killing')
> p.terminate()
> p.join()
> else:
> print('it died already')
> return wrapper
> return realdecorator
>
>
> @Timeout(3)
> def funct(s):
> for i in range(100):
> print s
> time.sleep(1)
>
>
> if __name__ == '__main__':
> funct('sleeping')
>
> -------------------------------------------------------------
>
> (**)
>
>
> def Timeout(timeout):
> def realdecorator(f):
> def wrapper(*k, **kw):
> p = multiprocessing.Process(target=f(*k, **kw))
> p.start()
> p.join(timeout)
> if p.is_alive():
> print('killing')
> p.terminate()
> p.join()
> else:
> print('it died already')
> return wrapper
> return realdecorator
>
>
> class MyClass(object):
>
> @Timeout(3)
> def funct(self, s):
> for i in range(100):
> print s
> time.sleep(1)
>
>
> if __name__ == '__main__':
> o = MyClass()
> o.funct("sleeping")
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20171204/4ad55354/attachment.html>
Más información sobre la lista de distribución Python-es