Dopo una lunga e brutale lotta, penso di aver risolto questo problema semplicemente eseguendo la strategia di cui parlano gli altri, ma utilizzando la stessa funzione di connessione psycopg2:
from psycopg2 import connect
conn = connect(
database=database,
user=username,
password=password,
host=hostname,
port=port,
connect_timeout=3,
# https://www.postgresql.org/docs/9.3/libpq-connect.html
keepalives=1,
keepalives_idle=5,
keepalives_interval=2,
keepalives_count=2)
Vedo che psycopg2 si blocca costantemente su query di lunga durata, ma ora il problema sembra essere completamente risolto.
Nota che potrebbe trattarsi di una nuova funzionalità, poiché questa domanda è vecchia.