Skip to main content

Simple in-process scheduler

Project description

classic-pg-listener

Библиотека дает простой класс Listener для добавления реакций на уведомления, передаваемые PostgreSQL при использовании команд LISTEN и NOTIFY.

Для использования необходимо передать функцию-фабрику, порождающую соединение. Соединение должно быть с autocommit=True.

Для добавления коллбеков используется метод .add_callback(). В него следует передать коллбек и название канала. Коллбек будет вызван при приеме уведомления в соответствующем канале.

Методом .remove_callback() можно убрать коллбек, если он больше не нужен.

Например:

from classic.pg.listener import Listener
from psycopg import connect, Notify

listener = Listener(
lambda: connect(
user='test',
password='test',
host='127.0.0.1',
port='5432',
dbname='test',
autocommit=True,
)
)

def some_task(notify: Notify):
print(notify)

listener.add_callback(some_task, 'some_channel')
listener.run()

Может работать в двух режимах:

  • "Блокирующий режим". При нем исполнение происходит в текущем потоке. Для этого используется блокирующий метод .run()

  • "Фоновый режим". При нем запускается внутренний поток для обслуживания соединения с базой и приема сообщений. В этом режиме класс похож на класс Thread из модуля threading. Метод .start() запускает фоновый поток, в котором происходит установка и обслуживание соединения, метод .stop() используется для запроса остановки фонового потока, методом .join() можно дождаться остановки внутреннего потока.

Пример использования в фоновом режиме:

from classic.pg.listener import Listener
from psycopg import connect, Notify

listener = Listener(
lambda: connect(
user='test',
password='test',
host='127.0.0.1',
port='5432',
dbname='test',
autocommit=True,
)
)

def some_task(notify: Notify):
print(notify)

listener.add_callback(some_task, 'some_channel')
listener.start()

print('Основной поток все еще свободен!')

listener.stop()
listener.join() # Дожидается остановки

Коллбеки, назначенные каналам, по умолчанию выполняются во внутреннем ThreadPoolExecutor. Параметром max_workers в конструкторе можно повлиять на размер пула. При max_workers исполнение будет происходить без пула, в том же потоке, что и обслуживает соединение. Таким образом, при запуске через метод .run() и значении max_workers=0 все, и обслуживание соединения, и исполнение коллбека будет происходить в одном потоке.

Методы .add_callback() и .remove_callback() выполняют свою работу не сразу. Оба метода возвращают future, в результате которого будет None, если добавление произошло успешно, либо выкинет исключение, произошедшее в потоке, обслуживающем слушателя.

Listener умеет регулярно опрашивать БД, в случае, если обновления не приходят в определённый период. Период устанавливается параметром ping_period в конструкторе Listener. По умолчанию 1 минута. Если ping_period=0, то проверка выполняться не будет.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

classic_pg_listener-1.2.6.tar.gz (7.0 kB view details)

Uploaded Source

File details

Details for the file classic_pg_listener-1.2.6.tar.gz.

File metadata

  • Download URL: classic_pg_listener-1.2.6.tar.gz
  • Upload date:
  • Size: 7.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.13

File hashes

Hashes for classic_pg_listener-1.2.6.tar.gz
Algorithm Hash digest
SHA256 4d59570a3b308a9a171bb9a376fd4ae40469786f05912965bf0e2840d50b1e40
MD5 bc195c63bd8aeb1a92d1d3b4b597185b
BLAKE2b-256 d3fafd7b21ee7812c8f74edf27bf53e0b29a16d8690bf08dd3d3e386e76809b6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page