python - 如何将在不同进程中完成的 SQLite 数据库更改通知进程?

标签 python sqlite notifications

假设我有两个或多个处理 SQLite 数据库的进程——一个“播放器”进程和许多“编辑器”进程。

“播放器”进程读取数据库并更新 View - 在我的例子中,它是根据数据库中存储的事件混合到声卡的波形。

“编辑器”进程是该数据库的任何编辑器:它不断更改数据库。

现在我希望播放器能够快速反射(reflect)编辑更改。

我知道 SQLite 提供钩子(Hook)来跟踪同一进程中的数据库更改,但似乎很少有关于如何在多个进程中执行此操作的信息。

我可以不断地轮询数据库、比较记录和触发事件,但这似乎效率很低,尤其是当数据库增长到很大时。

我正在考虑使用日志表和触发器,但我想知道是否有更简单的方法。

最佳答案

关系数据库不是您的最佳首选。

为什么?

您希望所有编辑器都将更改传递给您的播放器。

您的播放器实际上是所有这些编辑器的服务器。您的播放器需要多个打开的连接。它必须监听所有这些连接的变化。它必须显示这些更改。

如果更改确实很大,您可以转向混合解决方案,其中编辑器保留更改通知玩家。

无论哪种方式,编辑都必须通知玩家他们有更改。这比玩家试图发现数据库中的变化要简单得多。


更好的设计是一个服务器,它接受来自编辑器的消息,保存它们,并通知玩家。该服务器既不是编辑器也不是播放器,而只是确保处理所有消息的代理。它接受来自编辑和玩家的连接。它管理数据库。

有两种实现方式。服务器是播放器。服务器与播放器是分开的。服务器的设计没有改变——只有协议(protocol)。当服务器是播放器时,服务器直接调用播放器对象。当服务器与播放器分离时,服务器写入播放器的套接字。

当播放器是服务器的一部分时,当从编辑器收到消息时直接调用播放器对象。当播放器分离时,小型读取器从套接字收集消息并调用播放器对象。

播放器连接到服务器,然后等待信息流。这可以是来自编辑器的输入,也可以是对服务器保存在数据库中的数据的引用。

如果您的消息流量足够小,网络延迟不是问题,编辑器会将所有数据发送到服务器/播放器。如果消息流量太大,则编辑器写入数据库并向服务器/播放器发送仅包含数据库 FK 的消息。


请在您的问题中澄清“如果编辑器在通知时崩溃,则播放器将永久困惑”。

这听起来像是播放器服务的糟糕设计。除非它没有从各个编辑那里获得状态,否则它不可能“永远搞砸”。如果它从编辑器获取状态(但试图镜像该状态,例如),那么您应该考虑这样一种设计,玩家只需从编辑器获取状态并且不会“永远搞砸”。

关于python - 如何将在不同进程中完成的 SQLite 数据库更改通知进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/677028/

相关文章:

Android BroadcastReceiver 不启动

swift - 在动态框架中实现通知服务和内容扩展

python - 如何在 Django 1.6 应用程序中实现 Markdown ?

python - 重新排列 linregress python 中的标题

python - 如何在 Keras 中仅使用嵌入层且没有标签来训练模型

char * 与 unsigned char * 和转换

python - pandas 分组数据框 - python

android - 比较 SQLite 中的时间

android - SQLITE 批量插入以通过 UPDATE 和 INSERT 增加优化

iphone - 在后台运行时接收可达性通知?