sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo recibir notificaciones automáticas sobre cambios en las tablas?

donmage tiene toda la razón - LISTEN y NOTIFY eres lo que quieres Aún necesitará un ciclo de sondeo, pero es muy liviano y no causará una carga detectable en el servidor.

Si quieres psycopg2 para activar devoluciones de llamada en cualquier momento en su programa, puede hacer esto generando un hilo y haciendo que ese hilo ejecute el ciclo de sondeo. Verifique si psycopg2 impone el acceso de conexión seguro para subprocesos; si no es así, deberá realizar su propio bloqueo para que su ciclo de sondeo solo se ejecute cuando la conexión esté inactiva y ninguna otra consulta interrumpa un ciclo de sondeo. O simplemente puede usar una segunda conexión para su encuesta de eventos.

De cualquier manera, cuando el subproceso de fondo que está sondeando eventos de notificación recibe uno, puede invocar una función de devolución de llamada de Python proporcionada por su programa principal, que podría modificar estructuras de datos/variables compartidas por el resto del programa. Tenga cuidado, si hace esto, puede convertirse rápidamente en una pesadilla para mantener.

Si adopta ese enfoque, le sugiero que utilice el multithreading / multiprocessing módulos. Harán su vida enormemente más fácil, brindando formas simples de intercambiar datos entre subprocesos y limitando las modificaciones realizadas por el subproceso de escucha a ubicaciones simples y bien controladas.

Si usa subprocesos en lugar de procesos, es importante comprender que en cPython (es decir, "Python normal") no puede tener una verdadera interrupción de devolución de llamada, porque solo se puede ejecutar un subproceso en cPython a la vez. Lea sobre el "bloqueo de intérprete global" (GIL) para comprender más sobre esto. Debido a esta limitación (y la naturaleza más fácil y segura de la concurrencia predeterminada de nada compartido), a menudo prefiero el multiprocesamiento a los subprocesos múltiples.