#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
.