[pyar] Timeouts para codigo de terceras partes: PyThreadState_SetAsyncExc?

Andres Riancho andres.riancho en gmail.com
Lun Ene 5 16:58:17 ART 2015


Lista,

    Digamos que tengo una libreria que no controlo, para la cual no
deseo contribuir ni debugear, que para algunos inputs lleva mucho
tiempo para ejecutar. Dado que no me importa tanto la salida de esta
libreria quiero poder agregar un timeout a la llamada a esa libreria
de terceros. El codigo seria asi:

```
with Timeout(60):
    libreria.llamada(_inputs)
```

    Y cuando libreria.llamada lleva mas de 60 segundos corriendo el
context manager termina la funcion y hace un raise.

    Buscando encontre distintas opciones, pero finalmente me quede con
stopit [0], y especificamente con ThreadingTimeout que internamente
llama a ctypes.pythonapi.PyThreadState_SetAsyncExc . No puedo usar el
modulo signal porque mi programa es multi-threaded y no andaría bien.

    Leyendo por ahi encontre que el uso de PyThreadState_SetAsyncExc
no esta recomendado, y tambien me estoy encontrando con algunos issues
entre PyThreadState_SetAsyncExc y threading.RLocks [2].

    La pregunta entonces es... que otras soluciones tengo a este problema?

[0] https://pypi.python.org/pypi/stopit
[1] https://pypi.python.org/pypi/stopit#threading-based-resources
[2] https://github.com/glenfant/stopit/issues/6

Saludos,
-- 
Andrés Riancho
Project Leader at w3af - http://w3af.org/
Web Application Attack and Audit Framework
Twitter: @w3af
GPG: 0x93C344F3


More information about the pyar mailing list