15

您好,我想在 python 和进程之间共享少量数据(< 1K)。数据是物理 pc/104 IO 数据,变化迅速且经常 (24x7x365)。将有一个“服务器”写入数据,多个客户端读取数据的一部分。它将运行的系统使用闪存(CF 卡)而不是硬盘驱动器,所以我担心使用基于文件的方案会磨损闪存。我还想使用更少的电力(处理器时间),因为我们是 100% 太阳能供电的。

  • 这是一个有效的担忧吗?我们可能会将 CF 卡更改为 SSD。
  • 使用 mmap 更改值是物理地将数据写入磁盘还是虚拟文件?
  • 我们将在 Debian 上运行,所以也许 POSIX IPC for python 模块是最好的解决方案。有人用过吗?
  • 有没有人尝试过Python 对象共享 (POSH)模块?乍一看,它看起来很有希望,但它处于“Alpha”阶段,似乎并没有被积极开发。

谢谢你

更新:我们将最大数据更新速率降低到大约 10 Hz,但更常见的是 1 Hz。仅当值更改而不是恒定更新速率时才会通知客户端。我们已经进入了多服务器/多客户端模型,其中每个服务器专门处理某种类型的仪器或功能。由于事实证明大部分编程将由 Java 程序员完成,我们最终使用 JSON-RPC over TCP。服务器将用 Java 编写,但我仍然希望用 Python 编写主客户端,并且正在研究 JSON-RPC 实现。

4

4 回答 4

8

在服务器进程中将数据写入文件的另一种方法可能是直接写入客户端进程:

使用 UNIX 域套接字(如果客户端在不同机器上运行,则使用 TCP/IP 套接字)将每个客户端连接到服务器,并让服务器写入这些套接字。根据您的特定处理模型,选择客户端/套接字可能由服务器完成(例如循环)或由客户端发出信号表示他们已准备好进行更多操作。

于 2010-01-05T14:48:02.883 回答
4

创建一个 ramfs 分区并写入该分区。(您可以使用 tmpfs,但与 tmpfs 不同,ramfs 不会交换到磁盘)。但是,由于 ramfs 没有大小限制,因此您必须注意不要耗尽内存;因为你只在那里写了一点点数据,所以这应该不是问题。

这样,您的数据将永远不会写入磁盘(注意:如果断电,您将丢失它们)。

另请参阅 ramfs 文档

于 2010-01-05T14:38:26.877 回答
2

根据关于 mmap 系统调用的维基百科文章,内存映射文件内容在更新时会写回磁盘。

您是否查看过多处理模块(在标准库中)——尤其是进程之间的共享状态部分?

Piskvor 提到的 Ramfs 似乎也是一个很好的解决方案——尤其是当并非所有进程都用 Python 编写时。

于 2010-01-05T17:03:56.253 回答
0

在闪存系统上运行时,请确保您的文件系统设计正确,以最大限度地延长闪存的使用寿命(磨损均衡)。 JFFS以及我相信其他人现在能够有效地做到这一点。如果您使用这样的系统,您不应该过分担心使用闪存,但如果您正在写入恒定的数据流,您肯定希望避免在闪存上这样做。

使用 RAM 文件系统是个好主意。如果系统设计允许,最好完全避免使用文件系统。为此,您提到了POSH。我从未尝试过,但我们发现Pyro(“PYthon 远程对象”)在某些类似情况下是一种优雅而有效的解决方案。

当然还有标准库multiprocessing模块,它在进程之间的通信方式方面有一些相似之处。我会从那里开始这个领域的任何新发展,只有在它未能成功时才会去其他地方。

于 2010-01-05T18:22:37.533 回答