Соединение psycopg3 AsyncConnection уведомляет о проверке работоспособности генератораPython

Программы на Python
Ответить
Anonymous
 Соединение psycopg3 AsyncConnection уведомляет о проверке работоспособности генератора

Сообщение Anonymous »

Версия psycopg: 3.2.3
Версия postgres: PostgreSQL 14.13 (Homebrew) на x86_64-apple-darwin23.6.0, скомпилированная Apple clang версии 16.0.0 ( clang-1600.0.26.4), 64-разрядная версия
У меня есть длительный процесс (возможно, несколько месяцев), который прослушивает уведомления о соединении с базой данных с помощью conn.notify() (см. документацию psycopg3). В документации не указано ожидаемое поведение, если прослушивающее соединение перестает отвечать на запросы или повреждается, поэтому я полагаю, что мне необходимо выполнить проверку работоспособности самостоятельно.
Если conn. notifices() гарантированно вызовет исключение, если с соединением возникнут проблемы, тогда все остальное является спорным. Кто-нибудь знает?
Предполагая, что conn.notify() не обязательно вызывает исключение, в этом комментарии github говорится, что я могу выполнить оператор прослушивающего соединения без потери уведомлений.< /p>
Если вам нужно выполнить новый LISTEN для этого соединения, вы можете остановить генератор уведомлений (используя генераторы. close(), см. документацию), выполнить оператор и вызвать уведомления. () снова. При этом вы не потеряете сообщения: они в любом случае будут буферизованы в соединении libpq.

Код: Выделить всё

def _listen_for_notifications():
with psycopg.Connection.connect("some_connection_string", autocommit=True) as conn:
listen_sql = sql.SQL("LISTEN {}").format(sql.Identifier("some_channel_name"))

conn.execute(listen_sql)
gen = conn.notifies(timeout=5)
print('listening')
# This prints notifications sent within the five second timeout
for n in gen:
print(n)

gen.close()  # I see the same behavior with and without this line.

print("Performing health check")
# Any notifications sent over these three seconds are lost
conn.execute("select pg_sleep(3)")  # Would be SELECT 1 in real code

conn.execute(listen_sql)
gen = conn.notifies(timeout=5)
print('listening again on the same connection')
# This prints notifications sent within the five second timeout
for n in gen:
print(n)

print('done!')

_listen_for_notifications()
Вывод, когда я отправляю уведомление с полезной нагрузкой «1» в течение первых 5 секунд, уведомление с полезной нагрузкой «2» в течение 3 секунд выполняется pg_sleep(3) и уведомление с полезной нагрузкой «3» в течение последних 5 секунд.

Код: Выделить всё

listening
Notify(channel='some_channel_name', payload='1', pid=35237)
Performing health check
listening again on the same connection
Notify(channel='some_channel_name', payload='3', pid=35237)
done!
Уведомление 2 потеряно.

Подробнее здесь: https://stackoverflow.com/questions/792 ... alth-check
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»