Permitiendo que los hilos de pitón después de llamar a un bloqueo de E / S en un código de extensión de Python generados utilizando el TRAGO

StackOverflow https://stackoverflow.com/questions/2510696

  •  22-09-2019
  •  | 
  •  

Pregunta

He escrito una extensión de Python envolver una existente C ++ biblioteca live555 (RTSP envoltura interfaz de cliente para ser específicos) en el TRAGO . La extensión funciona cuando se opera en un solo hilo, pero tan pronto como lo llamo la función de bucle de eventos de la biblioteca, intérprete de Python nunca se pone la parte de atrás de control. Así que si puedo crear una tarea programada utilizando threading.Timer justo antes de llamar al ciclo de eventos, que la tarea nunca se ejecutará una vez comience el bucle de eventos. Para solucionar este problema, añadí Py_BEGIN_ALLOW_THREADS y Py_END_ALLOW_THREADS macros de forma manual en el auto TRAGO generada derivador de archivos CXX en cada llamada a la función doEventLoop(). Pero ahora, quiero hacer lo mismo (es decir, permiten hilos) cuando TRAGO genera el código en sí y no cambiar ningún código manualmente. Alguien ha hecho algo similar en el TRAGO?

P.S. - También me gustaría considerar el cambio a cualquier otro marco (como SIP) para conseguir este trabajo. He seleccionado TRAGO por encima de cualquier otra tecnología se debe a que la escritura de interfaz SWIG fue realmente muy fácil y sólo tenía que incluir los archivos de cabecera existentes.

¿Fue útil?

Solución

TRAGO le da un montón de ganchos para ayudar a que esto suceda. Si una solución aproximada es suficiente para sus necesidades, una cosa que he hecho en el pasado es algo como esto puso en mi archivo .swig:

%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

Este (ab) utiliza la facilidad TRAGO para la decoración de las llamadas a funciones C con algún tipo de lógica de control de errores con el fin de decorar las llamadas con un GIL bloqueo / desbloqueo. Ver El manejo de excepciones con % excepción en los documentos SWIG para obtener información sobre lo que está pasando aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top