如何接收有关表格更改的自动通知?

问题描述 投票:0回答:3

我正在使用的PostgreSQLPython我正在使用 Python 访问 PostgreSQL

我需要什么:如果有人在数据库的特定表上记录某些内容,则在 Python 上收到自动通知。

我认为可以使用一个例程在一段时间内转到该表并检查更改。但它需要一个循环,我想要类似异步方式的东西。

可能吗?

python postgresql events triggers listener
3个回答
18
投票

donmage 非常正确 -

LISTEN
NOTIFY
是你想要的。你仍然需要一个轮询循环,但它非常轻量级,不会导致可检测到的服务器负载。

如果您希望

psycopg2
在程序中任何时间触发回调,您可以通过生成一个线程并让该线程执行轮询循环来实现。检查 psycopg2 是否强制执行线程安全的连接访问;如果没有,您需要自己进行锁定,以便您的轮询循环仅在连接空闲时运行,并且没有其他查询会中断轮询周期。或者您可以只使用第二个连接进行事件轮询。

无论哪种方式,当轮询通知事件的后台线程收到通知事件时,它可以调用主程序提供的 Python 回调函数,这可能会修改程序其余部分共享的数据结构/变量。当心,如果你这样做,它很快就会成为维护的噩梦。

如果你采用这种方法,我强烈建议使用

multithreading
/
multiprocessing
模块。它们将使您的生活变得更加轻松,提供在线程之间交换数据的简单方法,并将监听线程所做的修改限制在简单且控制良好的位置。

如果使用线程而不是进程,重要的是要了解在 cPython(即“普通 Python”)中你不能有一个真正的回调中断,因为在 cPython 中一次只能执行一个线程。阅读“全局解释器锁”(GIL) 以了解更多相关信息。由于这个限制(以及默认并发时无共享更简单、更安全的性质),我通常更喜欢多处理而不是多线程。


16
投票

您正在寻找的命令可能是LISTEN/NOTIFY.

如果您正在使用 psycopg,请查看 异步通知 部分。

[虽然这确实需要轮询。]


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.