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....@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@python.org > https://mail.python.org/mailman/listinfo/python-es >
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es