0

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

这是一个将在 Raspberry Pi 上运行的项目,我希望它尽可能地轻量级。

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

4

2 回答 2

2

SQLite 非常适合在进程之间共享信息,尽管我怀疑它的锁定是相当粗粒度的,所以如果进程频繁更新(很多次),那么您可能会发现这会影响性能。但是,如果您的进程在不同的机器上运行,那么您需要为它们安排一些共享存储。由于 SQLite 依赖于文件锁定,像 NFS 这样的共享文件系统可能会出现问题 - 请参阅他们的常见问题解答了解详细信息。

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

话虽如此,听起来您真正想要实现的是让进程相互唤醒,而使用数据库则更难。您通常最终不得不频繁地轮询特定值,这是一种非常低效的做事方式。如果您追求静态数据存储,那么数据库很棒,但它们并不能真正替代正确的IPC。如果您不需要发送数据,您也可以考虑使用 UDP 而不是 TCP,而不仅仅是“唤醒电话”。但是请记住,UDP 不保证可靠性,您可能会发现比 UDP 套接字更多的关于 TCP 套接字的教程和文档。

如果你不习惯使用原始套接字,你看过0MQ吗?它是一个消息传递系统,可以在套接字上运行。它具有 Python 绑定,并且性能非常好。也许这种抽象可能比处理原始套接字更适合您?

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

您将遇到的主要复杂性是一次处理多个连接。如果您喜欢使用线程,您可以为每个连接生成一个线程(即每个其他机器一个线程),或者您可以将事物保持在同一个线程中,并使用select模块的功能等待多个连接上发生某些事情。

于 2013-07-26T14:13:25.847 回答
1

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

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

于 2013-07-26T14:38:24.720 回答