我需要创建多个服务器(至少 3 个)来执行不同的任务,理想情况下我需要一个能够与它们通信的中央服务器。我看过套接字,它们似乎超出了我的范围。我更喜欢使用每个服务器都可以写入的数据库,并且它们可以在它们之间交换信息,在消息被操作时设置适当的标志。
这是一个将在 Raspberry Pi 上运行的项目,我希望它尽可能地轻量级。
我正在考虑使用 sqlite3,但不确定这是否是应用程序/进程之间合适的通信形式。python脚本可以“侦听”数据库的更改,还是需要在循环中阻塞,直到找到消息?
我需要创建多个服务器(至少 3 个)来执行不同的任务,理想情况下我需要一个能够与它们通信的中央服务器。我看过套接字,它们似乎超出了我的范围。我更喜欢使用每个服务器都可以写入的数据库,并且它们可以在它们之间交换信息,在消息被操作时设置适当的标志。
这是一个将在 Raspberry Pi 上运行的项目,我希望它尽可能地轻量级。
我正在考虑使用 sqlite3,但不确定这是否是应用程序/进程之间合适的通信形式。python脚本可以“侦听”数据库的更改,还是需要在循环中阻塞,直到找到消息?
SQLite 非常适合在进程之间共享信息,尽管我怀疑它的锁定是相当粗粒度的,所以如果进程频繁更新(很多次),那么您可能会发现这会影响性能。但是,如果您的进程在不同的机器上运行,那么您需要为它们安排一些共享存储。由于 SQLite 依赖于文件锁定,像 NFS 这样的共享文件系统可能会出现问题 - 请参阅他们的常见问题解答了解详细信息。
MySQL 和 PostgreSQL 都是明智的选择,它们允许通过网络进行连接,并且应该使多台机器更容易同时访问数据库,尽管它们需要比 SQLite 更多的设置。
话虽如此,听起来您真正想要实现的是让进程相互唤醒,而使用数据库则更难。您通常最终不得不频繁地轮询特定值,这是一种非常低效的做事方式。如果您追求静态数据存储,那么数据库很棒,但它们并不能真正替代正确的IPC。如果您不需要发送数据,您也可以考虑使用 UDP 而不是 TCP,而不仅仅是“唤醒电话”。但是请记住,UDP 不保证可靠性,您可能会发现比 UDP 套接字更多的关于 TCP 套接字的教程和文档。
如果你不习惯使用原始套接字,你看过0MQ吗?它是一个消息传递系统,可以在套接字上运行。它具有 Python 绑定,并且性能非常好。也许这种抽象可能比处理原始套接字更适合您?
最后一点,一旦您了解了这些概念,套接字编程并不是那么棘手,但它确实有一个相当长的学习曲线,直到您对所发生的事情感到满意为止。如果你想尝试一下,我建议从 Python 的Socket Programming HOWTO开始。
您将遇到的主要复杂性是一次处理多个连接。如果您喜欢使用线程,您可以为每个连接生成一个线程(即每个其他机器一个线程),或者您可以将事物保持在同一个线程中,并使用select模块的功能等待多个连接上发生某些事情。