我有一个进程在实时收集数据,另一个进程在绘制数据。这两个进程通过管道连接,数据采集进程为数据绘图进程提供数据。
我更看重数据采集部分的速度,而不是绘图部分的可靠性。快速skim显示,如果伙伴进程较慢,管道中的默认行为是让管道的写入和读取端表现出阻塞行为。这是不好的,因为数据采集过程可能会等待绘图过程。
有没有办法让外壳管道不阻塞,就像C的O_NONBLOCK一样?我不关心一个数据点是否没有被绘制出来,因为它被一个新的点覆盖了……
编辑:实际上,我认为管道缓冲区足够大,可以容纳数据采集过程的输出,而不需要绘图部分立即处理它。
发布于 2011-11-04 15:49:27
如果数据采集进程需要不受绘图进程的限制而运行,则需要与连接两者的管道不同的结构,或者需要中间的额外进程来丢弃尚未发送到绘图仪的旧数据点。
从概念上讲:
+-------------+ +------------+ +-------+
| Acquisition |--->|Holding Tank|--->|Plotter|
+-------------+ +------------+ +-------+
“保存槽”可以在其输入和输出描述符上使用select()
或类似的调用,并且可以保存有限数量的数据点。当一个新的点从获取过程中到达时,如果它的储存箱已满,它可以丢弃最旧的点,并在其位置添加新的点。如果绘图仪输入中有空格,则可以将新的数据点写入绘图仪。同时,采集过程可以全速运行(只要保持罐不会阻塞它),绘图仪也可以全速运行。这三个过程都是通过管道连接的。没有管道作为非阻塞操作运行。
https://stackoverflow.com/questions/8005919
复制相似问题