Я использую следующий код (найденный в Интернете), чтобы перехватить изменения (в базе данных срабатывает триггер, который отправляет NOTIFY) в таблицу PostgreSQL из Python с использованием psycopg2:
import select
import psycopg2
import psycopg2.extensions
from config import config
params = config()
conn = psycopg2.connect(**params)
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
curs = conn.cursor()
# Run SQL LISTEN command on channel "section_change"
curs.execute("LISTEN section_change;")
print("")
print("Waiting for section changes ...")
print("")
while True:
if select.select([conn],[],[],10) == ([],[],[]):
pass
print("Timeout")
else:
conn.poll()
while conn.notifies:
# Section change notification caught
notify = conn.notifies.pop(0)
if notify.channel == "section_change":
print("Section change occurred")
В данный момент тайм-аут установлен на 10 секунд (четвертый параметр для выбора. Выбрать). Я попытался пропустить оператор if (отключение тайм-аута), который привел к 100% -ному использованию ЦП (соответственно ядра), так что это бесполезно.
Как влияет длительность тайм-аута?
Я хочу хорошую отзывчивость и низкое потребление процессора; помогут более низкие или более высокие значения времени ожидания?