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

发布于 2021-01-29 15:13:10

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

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

我认为可以使用在一定间隔内进入该表并检查更改的例程。但这 需要一个循环 ,我想要一种 异步方式

可能吗?

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    donmage是完全正确的-LISTENNOTIFY你想要的东西。您仍然需要一个轮询循环,但是它非常轻巧,不会导致可检测的服务器负载。

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

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

    如果您采用这种方法,我强烈建议您使用multithreading/multiprocessing模块。它们将使您的生活大大简化,提供了在线程之间交换数据的简单方法,并将侦听线程所做的修改限制在简单且控制良好的位置。

    如果使用线程而不是进程,则必须了解在cPython(即“普通Python”)中不能有真正的回调中断,因为在cPython中一次只能执行一个线程。阅读有关“全局解释器锁”(GIL)的更多信息。由于此限制(默认情况下并发,并且没有共享的情况更容易,更安全),我经常更喜欢多处理而不是多线程。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看