[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