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

Claudio Freire klaussfreire en gmail.com
Lun Ene 5 20:37:19 ART 2015


2015-01-05 20:30 GMT-03:00 Andres Riancho <andres.riancho en gmail.com>:
> Alejandro,
>
> On Mon, Jan 5, 2015 at 7:36 PM, Alejandro Santos <listas en alejolp.com> wrote:
>> 2015-01-05 20:58 GMT+01:00 Andres Riancho <andres.riancho en gmail.com>:
>>>
>>>     La pregunta entonces es... que otras soluciones tengo a este problema?
>>>
>>
>> import multiprocessing
>> import time
>>
>> def exec_with_timeout(f, args, timeout):
>>     p = multiprocessing.Process(target=f, args=args)
>>     p.start()
>>     p.join(timeout)
>>     if p.is_alive():
>>         p.terminate()
>>
>> def bad_func(t):
>>     while True:
>>         time.sleep(t)
>>
>> exec_with_timeout(bad_func, (5.0, ), 0.1)
>
>     Gracias por la buena propuesta, despues de enviar el email estuve
> viendo eso y creo que en una gran cantidad de casos sirve pero... a mi
> no me va a servir ya que la respuesta de la libreria es un objeto que
> NO se puede serializar, por lo que no lo puedo pasar entre el
> subproceso (multiprocessing.Process) y el proceso principal.
>
>     Alguna idea de como hacer un workaround de eso? Estuve leyendo un
> poco sobre multiprocessing.Namespace, pero no estoy seguro, deberia
> probarlo.


Podés intentar lo mismo con threading.Thread en vez de multiprocessing.Process.

Funcionará, si la librería libera el GIL al llamar a la función de C
(que si tarda mucho y no usa objetos python directamente es más que
recomendable y es posible que ya lo hagan).

Si no lo hace, es una opción contribuir al menos eso (liberar el GIL
en esas llamadas). Al menos es lo único que tendrías que contribuir.


More information about the pyar mailing list