如何在Python进程间共享数据而不写入磁盘

14 投票
4 回答
3214 浏览
提问于 2025-04-15 17:39

你好,

我想分享一些小数据(小于1K)在Python和其他进程之间。这些数据是物理的pc/104 IO数据,变化很快,几乎是24小时不间断的。会有一个“服务器”来写数据,多个客户端来读取其中的一部分。

这个系统会运行在使用闪存(CF卡)而不是硬盘的设备上,所以我担心用基于文件的方式会让闪存过快磨损。我也希望能减少功耗(处理器时间),因为我们是完全依靠太阳能供电的。

  • 这是个合理的担忧吗?我们可以考虑把CF卡换成SSD。
  • 使用mmap改变一个值时,数据会实际写入磁盘吗,还是说这是一个虚拟文件?
  • 我们会在Debian上运行,所以也许Python的POSIX IPC模块是最好的解决方案。有人用过吗?
  • 有没有人尝试过Python对象共享(POSH)模块?乍一看它看起来很有前景,但它现在是“Alpha”版本,似乎没有在积极开发。

谢谢你

更新:

我们把数据更新的最大速率放慢到大约10赫兹,通常是1赫兹。客户端只有在值发生变化时才会被通知,而不是以固定的更新速率。

我们已经转向了多个服务器/多个客户端的模型,每个服务器专注于某种类型的仪器或功能。

由于大部分编程工作将由Java程序员完成,我们最终决定使用JSON-RPC通过TCP进行通信。服务器将用Java编写,但我仍然希望用Python编写主要客户端,并正在研究JSON-RPC的实现。

4 个回答

2

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

你有没有看过标准库中的多进程模块,特别是关于进程间共享状态的部分?

Piskvor提到的Ramfs似乎也是一个不错的解决方案,特别是当并不是所有进程都是用Python编写的时候。

4

创建一个ramfs分区并在上面写入数据。(你也可以使用tmpfs,但与tmpfs不同,ramfs不会把数据换到硬盘上。)不过,由于ramfs没有大小限制,你需要注意不要耗尽内存;因为你只是在这里写一点点数据,所以这应该不是问题。

这样一来,你的数据就不会被写入硬盘(注意:如果断电,你会丢失这些数据)。

查看ramfs文档

8

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

可以使用UNIX域套接字(如果客户端在不同的机器上,可以使用TCP/IP套接字)来连接每个客户端和服务器,然后让服务器将数据写入这些套接字。根据你的具体处理方式,选择客户端/套接字的方式可以由服务器来决定(比如轮询选择),或者由客户端发信号表示它们准备好接收更多数据。

撰写回答