如何接收有关表更改的自动通知?
我正在使用的是 : PostgreSQL 和 Python 。 我正在使用Python访问PostgreSQL
我需要的是 :如果有人在数据库的特定表上记录了某些内容,则会在Python上收到自动通知。
我认为可以使用在一定间隔内进入该表并检查更改的例程。但这 需要一个循环 ,我想要一种 异步方式 。
可能吗?
-
donmage是完全正确的-
LISTEN
和NOTIFY
你想要的东西。您仍然需要一个轮询循环,但是它非常轻巧,不会导致可检测的服务器负载。如果要 随时
在程序中psycopg2
触发回调,则可以通过产生一个线程并让该线程执行轮询循环来实现。检查psycopg2是否强制执行线程安全的连接访问;如果不是这样,则需要进行自己的锁定,以便轮询循环仅在连接空闲时运行,并且没有其他查询会中断轮询周期。或者,您可以仅将第二个连接用于事件轮询。
__无论哪种方式,当轮询通知事件的后台线程收到一个时,它都可以调用主程序提供的Python回调函数,这可能会修改程序其余部分共享的数据结构/变量。请注意,如果这样做,它很快就会成为维护噩梦的场所。
如果您采用这种方法,我强烈建议您使用
multithreading
/multiprocessing
模块。它们将使您的生活大大简化,提供了在线程之间交换数据的简单方法,并将侦听线程所做的修改限制在简单且控制良好的位置。如果使用线程而不是进程,则必须了解在cPython(即“普通Python”)中不能有真正的回调中断,因为在cPython中一次只能执行一个线程。阅读有关“全局解释器锁”(GIL)的更多信息。由于此限制(默认情况下并发,并且没有共享的情况更容易,更安全),我经常更喜欢多处理而不是多线程。