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