我们正在实现一个嵌入式 Linux 系统,并且必须在网站上提供实时更新图表,显示来自系统后台进程的数据。
问题是如何在以下方面以最佳方式共享数据:
定期用新值更新环形缓冲区的数据生成过程,用 C 编写。
必须获取缓冲区最新内容的网络服务器 CGI 函数。我们使用 Python 来实现 CGI(nginx+wsgi+flask)。
我目前倾向于为此制定一个unix套接字解决方案,但我认为这需要C程序中的多线程以确保后台进程不受干扰。
我想知道有没有更简单的方法。我们可以直接将缓冲区内存映射为虚拟文件吗?使用 RAM 磁盘上的普通文件作为缓冲区并仅查找并写入它怎么样?
答案1
使用文件和原子重命名的简单解决方案可以使用脚本语言轻松实现。
发件人
- 将数据写入文件
A
- 将文件重命名
A
为B
重命名是原子的,并且可以在接收者处理旧文件时完成。
如果接收方没有读取数据,发送方不会阻塞。
接收者
如果处理相同的数据两次没有问题:
- 打开文件
B
- 读取数据
- 关闭文件
当存在多个接收器时(例如 Web 服务器的多个 CGI 进程),此选项也适用。
- 打开文件
如果接收方不应两次处理相同的数据:
- 将文件重命名
B
为C
- 如果成功,读取并处理文件
C
- 可选择删除文件
C
此选项仅适用于单个接收器。
- 将文件重命名
在这两种情况下,如果发送方写入数据的速度比接收方读取数据的速度快,旧数据就会丢失。
当然还有其他选择。