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

Alejandro Santos listas en alejolp.com
Mar Ene 6 00:03:02 ART 2015


2015-01-06 3:49 GMT+01:00 Alejandro Santos <listas en alejolp.com>:
> 2015-01-06 0:30 GMT+01:00 Andres Riancho <andres.riancho en gmail.com>:
>>
>>     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.
>>
>
> ¿Qué es lo que la librería devuelve, un file handle o socket? Contame
> un poco más en detalle cómo funciona. Lo que podés hacer es mover tu
> lógica de procesamiento dentro de bad_func.
>
> Por ejemplo, si tu librería devuelve un socket que tenés que usar,
> hacele read y write dentro de bad_func.
>

Una alternativa sería que, en vez de tener un timeout, hacer un
watchdog con una especie de ping dentro de bad_func. Usás una Queue
para avisarle al proceso padre que la ejecución sigue funcionando, y
cuando pasa determinado tiempo sin respuesta el padre mata al proceso
hijo:

import multiprocessing
from Queue import Empty
import time

def exec_with_timeout(f, args, timeout):
    Q = multiprocessing.Queue()
    p = multiprocessing.Process(target=f, args=(Q, args))
    p.start()
    while p.is_alive():
        try:
            if not: Q.pop(True, timeout):
                break
        except Empty:
            break

    if p.is_alive():
        p.terminate()

def bad_func(q, t):
    while True:
        time.sleep(t)
        q.push(True) # Le avisamos al padre que todo OK.

exec_with_timeout(bad_func, (5.0, ), 0.1)




-- 
Alejandro Santos


More information about the pyar mailing list