我可以通过sqlite在多个python应用程序之间共享信息吗?

时间:2013-07-26 13:45:33

标签: python sqlite raspberry-pi

我需要创建多个服务器(至少3个)执行不同的任务,理想情况下我需要一个中央服务器才能与它们通信。我看过插座,它们似乎超出了我的范围。我更习惯使用每个服务器都可以写入的数据库,他们可以在自己之间交换信息,在消息被操作时设置适当的标志。

这是针对将在Raspberry Pi上运行的项目,我希望尽可能保持轻量级。

我正在考虑使用sqlite3,但我不确定这是否是应用程序/进程之间的适当通信形式。 python脚本可以“监听”数据库的更改,还是需要在循环中阻塞,直到找到消息?

2 个答案:

答案 0 :(得分:2)

SQLite非常适合在进程之间共享信息,虽然我怀疑它的锁定非常粗糙,因此如果进程频繁更新(许多秒),那么您可能会发现这会影响性能。但是,如果您的进程在不同的计算机上运行,​​那么您需要为它们安排一些共享存储。由于SQLite依赖于文件锁定,因此NFS等共享文件系统可能存在问题 - 有关详细信息,请参阅their FAQ

MySQL和PostgreSQL都是明智的选择,允许通过网络进行连接,并且应该让多台机器更容易一次访问数据库,尽管它们需要比SQLite更多的设置。

所有这一切,听起来你真正希望实现的是流程被彼此唤醒,而这种事情对于数据库来说更难。您通常最终不得不频繁地对特定值进行轮询,这是一种非常低效的处理方式。如果您在静态数据存储之后,数据库很棒,但它们并不能替代正确的IPC。如果您不需要发送数据,您可能还会考虑使用UDP而不是TCP,而不仅仅是“唤醒呼叫”。请记住,UDP不保证可靠性,但您可能会发现有关TCP套接字的更多教程和文档,而不是UDP。

如果你不习惯使用原始套接字,你看过0MQ吗?它是一个消息传递系统,可以运行,其中包括套接字。它有Python绑定,它表现得非常好。或许抽象可能比处理原始套接字更适合你?

作为最后一点,套接字编程并不是那么棘手一旦你理解了概念,但它确实有一个学习曲线,直到你对正在发生的事情感到满意为止。如果你想尝试一下,我建议从Python的Socket Programming HOWTO开始。

您将要拥有的主要复杂性是同时处理多个连接。如果您对使用线程感到满意,可以为每个连接生成一个线程(即每个其他机器一个线程),或者您可以将事物保存在同一个线程中,并等待具有{{3的功能的多个连接上发生的事情。模块。

答案 1 :(得分:1)

如果共享的信息不需要持久性且您的数据结构不高,那么您可以考虑使用redis。它是一个键/值存储,可以将所有内容保存在内存中(尽管您可能是i / o绑定的)并且非常易于使用。

另一种选择是使用zero-rpc。它建立在0MQ之上,使服务之间的通信变得容易。它为您提取套接字和序列化等等