почему курсор подключения должен быть читаемым для цикла прослушивания уведомлений psycopg2

#python #postgresql #psycopg2

Вопрос:

psycopg2 предоставляет несколько примеров кода для использования средств уведомления postgresql

 import select
import psycopg2
import psycopg2.extensions

conn = psycopg2.connect(DSN)
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)

curs = conn.cursor()
curs.execute("LISTEN test;")

print "Waiting for notifications on channel 'test'"
while True:
    if select.select([conn],[],[],5) == ([],[],[]):
        print "Timeout"
    else:
        conn.poll()
        while conn.notifies:
            notify = conn.notifies.pop(0)
            print "Got NOTIFY:", notify.pid, notify.channel, notify.payload
 

Что select.select([conn],[],[],5) == ([],[],[]) делает код?

Документация select.select предполагает, что мы пытаемся убедиться, что сокет, лежащий conn в основе, «готов к чтению».

Что означает, что соединение psycogp2 должно быть «готово к чтению»?

Ответ №1:

conn.poll () — это неблокирующая команда. Если нет доступных уведомлений (или других сообщений), он все равно вернется немедленно, просто ничего не сделав. Когда это делается в замкнутом цикле, это было бы занято ожиданием, и это плохо. Он сожжет весь процессор, ничего не делая, и может даже дестабилизировать всю систему.

Выбор означает «вежливо подождите, пока в соединении будет что-то прочитано (подразумевая, что опрос, вероятно, будет чем-то занят), или в течение 5 секунд, в зависимости от того, что произойдет раньше. Если вы вместо этого хотите бесконечно ждать появления сообщения, просто удалите ,5 его из списка избранных. Если бы вы хотели дождаться чего-то интересного на первом из нескольких дескрипторов, вы бы поместили их все в список избранного, а не только conn .