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

Ric*_*ard 9 python postgresql events triggers listener

我正在使用的是:PostgreSQLPython.我正在使用Python来访问PostgreSQL

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

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

可能吗?

Cra*_*ger 9

donmage是对的 - LISTEN而且NOTIFY是你想要的.您仍然需要一个轮询循环,但它非常轻量级,并且不会导致可检测的服务器负载.

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

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

如果采用这种方法,我强烈建议使用multithreading/ multiprocessingmodules.它们将使您的生活变得更加轻松,提供了在线程之间交换数据的简单方法,并限制了监听线程对简单且控制良好的位置所做的修改.

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


Dmi*_*ing 8

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

如果您使用的是psycopg,请查看" 异步通知 "部分.

[这确实需要轮询.]

  • 虽然需要轮询,但这只是非常轻量级的轮询 - 您可以发送一个空命令,例如`curs.execute("")`来激活连接。如果您没有使用 SSL,实际上 psycopg2 没有理由无法检查套接字上新的可读数据,并且根本不需要轮询即可执行此操作,但它可能不支持这一点。 (2认同)