我目前通过内存映射在多个进程之间共享数据(<1KB)。 1个“编写者”进程和多个“阅读器”处理所有mmap个相同的文件。
目前读者流程需要不断检查更新。读者进程继续轮询mmap-ed区域以查看是否写入了任何新数据。
典型用法(及现有实施):
“Writer”进程是一个记录器,它以不规则的间隔不断追加新数据(每个都在新行上)。在任何给定的时间点,可以存在一个或多个“读取器”进程,其对“编写器”进程生成的任何新数据感兴趣。此外,它不是具有无限延伸的文件,而是循环缓冲区,即在固定数量的行之后,写入器循环返回并开始用新数据从头开始覆盖文件。该文件中的标题字段跟踪最新数据的位置,即当前的“头部”。
简而言之,系统试图模仿 msgsnd()&amp;的语义。 msgrcv()还有两个警告:
支持多个“读者”
当“作家”发布单个消息时,应发送多个通知,每个通知1个
积极的“读者”。
- &GT;目前实现的目标是每个“读者”不断轮询“头部”字段并在更改时读取新数据。
持久性(文件支持)
如果任何“读取器”/“写入器”进程突然终止,则恢复系统应该像重新启动进程一样简单。
- &GT;目前实现的是,IPC共享数据保存在磁盘上备份的mmap-ed文件中。
会是什么 - 快速(低延迟)和
- 轻量级(低CPU使用率)替代实现某种事件机制,以便每次通知读取器进程 mmap-ed区域是由编写进程修改的吗?
注意:在阅读器进程中,在mmap-ed文件中添加inotify监视在编写进程更新mmap-ed内存时不会导致任何事件(即使在致电msync())之后。
答案 0 :(得分:0)
在所有阻止通信中,阅读器会抓取数据,其他读者无法读取数据。
虽然问题很严重......这些都是我得到的......
答案 1 :(得分:0)
(发布实际使用的解决方案以供将来参考)
使用此补丁添加mmap-ed file support to inotify,
const subscription = this.http.get(`/api/v2/url`).subscribe();
subscription.unsubscribe();
。