Cancelar ejecución de la consulta en psycopg2
-
19-09-2019 - |
Pregunta
¿Cómo uno va sobre la cancelación de la ejecución de una instrucción de consulta utilizando pyscopg2 (Postgres el controlador pitón)?
A modo de ejemplo, digamos que tengo el siguiente código:
import psycopg2
cnx_string = "something_appropriate"
conn = psycopg2.connect(cnx_string)
cur = conn.cursor()
cur.execute("long_running_query")
A continuación, quiero cancelar la ejecución de esa consulta larga que va desde otro hilo -? Qué método tendría que recurrir a los objetos de conexión / cursor para hacer esto
Solución
Puede cancelar una consulta llamando a la pg_cancel_backend(pid)
función PostgreSQL en una conexión separada.
Puede saber el PID del backend para cancelar desde el connection.get_backend_pid()
método de psycopg2 (disponible de versión 2.0.8).
Otros consejos
Soporte de ejecución asíncrono de psycopg2 ha sido eliminado .
Si puede utilizar py-PostgreSQL y su (que es py3k), la implementación interna es asíncrona y apoyos que se interrumpió.
El objeto de conexión tiene un miembro de cancelar. El uso de este y con hilo podría utilizar
sqltimeout = threading.Timer(sql_timeout_seconds, conn.cancel)
sqltimeout.start()
Cuando el tiempo se agota, la cancelación se envía a la conexión y una excepción será levantado por el servidor. No se olvide de cancelar el temporizador cuando la consulta termina normalmente ....
sqltimeout.cancel()