我有一个实时收集数据的流程和另一个正在绘制它的流程。这两个过程通过管道连接,数据采集过程为数据绘制过程提供信息。
我更重视数据采集部分的速度而不是绘图部分的可靠性。快速skim表明,如果伙伴进程较慢,则管道中的默认行为是管道的写入和读取端显示阻塞行为。这很糟糕,因为数据采集过程可以等待绘图过程。
有没有办法让shell管道无阻塞,la C的O_NONBLOCK?我不在乎是否有一个数据点没有被绘制,因为它被新点覆盖......
编辑:实际上,我认为管道缓冲区足够大,可以保存数据采集过程的输出而不需要绘图部分立即处理它。
答案 0 :(得分:1)
如果数据采集过程需要通过绘图过程不受限制地运行,则需要与连接两者的管道不同的结构 - 或者您需要一个额外的过程,可以丢弃尚未发送的旧数据点给绘图员。
概念:
+-------------+ +------------+ +-------+
| Acquisition |--->|Holding Tank|--->|Plotter|
+-------------+ +------------+ +-------+
'储罐'可以在其输入和输出描述符上使用select()
或类似的调用,并且可以保存有限数量的数据点。当一个新点从采集过程到达时,如果它的储罐已满,它可以丢弃最旧的点并在其位置添加新的点。如果绘图仪输入中有空格,则可以将新数据点写入绘图仪。同时,采集过程可以平稳运行(只要储罐永远不会堵塞),绘图仪也可以平稳运行。这三个过程都通过管道连接。没有管道作为非阻塞操作运行。