如何在不写入磁盘的情况下在python进程之间共享数据

时间:2010-01-05 14:31:04

标签: python ipc mmap json-rpc pc104

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

  • 这是一个有效的担心吗?我们可以将CF卡更换为SSD。
  • 使用mmap更改值是否物理上将数据写入磁盘或者这是一个虚拟文件?
  • 我们将在Debian上运行,所以也许用于python模块的POSIX IPC是最好的解决方案。有人用过吗?
  • 有人试过Python Object Sharing (POSH)模块吗?乍一看它看起来很有希望,但它处于“Alpha”状态,并且似乎没有积极开发。

谢谢

更新: 我们将最大数据更新速率降低到大约10 Hz,但更典型的是1 Hz。客户端仅在值更改时通知,而不是以不断更新的速率通知。 我们已经进入了多服务器/多客户端模型,其中每个服务器都专注于某种类型的仪器或功能。 由于事实证明大多数编程都是由Java程序员完成的,我们最终使用的是JSON-RPC over TCP。服务器将用Java编写,但我仍然希望用Python编写主客户端并调查JSON-RPC实现。

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

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

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

See also the ramfs docs

答案 2 :(得分:2)

根据Wikipedia article about the mmap system call,更新时内存映射文件内容会写回磁盘

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

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

答案 3 :(得分:0)

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

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

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