Ric*_*ard 9 python postgresql events triggers listener
我正在使用的是:PostgreSQL和Python.我正在使用Python来访问PostgreSQL
我需要的:如果有人在数据库上的特定表上记录某些内容,则在Python上接收自动通知.
我认为可以使用在某个时间间隔内转到该表的例程,并检查更改.但它需要一个循环,我想要一种类似于同步方式的东西.
可能吗?
donmage是对的 - LISTEN而且NOTIFY是你想要的.您仍然需要一个轮询循环,但它非常轻量级,并且不会导致可检测的服务器负载.
如果要在程序psycopg2中随时触发回调,可以通过生成线程并让该线程执行轮询循环来实现.检查psycopg2是否强制执行线程安全的连接访问; 如果没有,您将需要进行自己的锁定,以便轮询循环仅在连接空闲时运行,并且没有其他查询中断轮询周期.或者您可以使用第二个连接进行事件轮询.
无论哪种方式,当轮询通知事件的后台线程收到一个时,它可以调用主程序提供的Python回调函数,这可能会修改程序其余部分共享的数据结构/变量.请注意,如果你这样做,它很快就会成为维持的噩梦.
如果采用这种方法,我强烈建议使用multithreading/ multiprocessingmodules.它们将使您的生活变得更加轻松,提供了在线程之间交换数据的简单方法,并限制了监听线程对简单且控制良好的位置所做的修改.
如果使用线程而不是进程,重要的是要理解在cPython(即"普通Python")中你不能有真正的回调中断,因为一次只能在cPython中执行一个线程.阅读"全球翻译锁"(GIL)以了解更多相关信息.由于这种限制(以及默认并发时无共享的更容易,更安全的性质),我经常更喜欢多处理到多线程.
您正在寻找的命令可能是LISTEN/NOTIFY.
如果您使用的是psycopg,请查看" 异步通知 "部分.
[这确实需要轮询.]