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