1

How should I stream the output from one program to an undefined number of programs in such a fashion that the data isn't buffered anywhere and that the application where the stream originates from doesn't block even if there's nothing reading the stream, but the programs reading the stream do block if there's no output from the first-mentioned program?

I've been trying to Google around for a while now, but all I find is methods where the program does block if nothing is reading the stream.

4

3 回答 3

1

我应该如何将一个程序的输出流式传输到未定义数量的程序,使得数据不会在任何地方缓冲,并且即使没有任何内容读取流,流源自的应用程序也不会阻塞

如果没有某种形式的缓冲区,您的要求是不可能得到满足的。

最直接的选择是将输出写入文件并让消费者读取该文件。

另一种选择是使用内存映射文件形式的环形缓冲区。由于环形缓冲区的容量通常是固定的,因此需要制定处理慢消费者的策略。选项是:阻止生产者;终止慢消费者;让缓慢的消费者在丢失数据时以某种方式恢复。

于 2012-12-27T09:04:15.343 回答
0

在不确切知道您在谈论什么类型的数据(数据有多大,它是什么格式等)的情况下,很难想出一个具体的答案。例如,假设您想要一个“ticker-tape”应用程序,该应用程序发送在证券交易所购买股票的信息,您可以很容易地拥有一个从每个应用程序接受套接字的服务器,启动一个线程并发送相关数据作为它从股票市场的重新编码器中出现。我不知道今天存在任何“多路复用器”(但格雷格的可能是一个起点)。如果您使用(例如)XML 来打包数据,您可以发送数据包的后半部分,客户端代码会检测到它不完整,因此将其丢弃。

另一方面,如果您要发送整个国家/地区的高详细实时更新天气图,则数据可能足够大,以至于您不想等待一个全新的到达,因此您需要某种lock'n'load 协议,它设置当前更新的地图,然后将其发送出去,直到(比如说)1 分钟后你有一个新地图。同样,写一些代码来做这件事并没有那么复杂,但它与上面的“ticker tape”解决方案完全不同,因为数据包更大,获得“半包”非常浪费,而且完全没用。

如果您正在流式传输 2016 年巴西奥运会的直播视频,那么您可能需要更不同的解决方案,因为时间就是视频的一切,您需要客户端缓冲、拾取关键帧、丢弃“陈旧”帧,等等,等等,服务器必须不同。

于 2012-12-27T14:57:20.967 回答
0

许多年前,我为音频流处理应用程序 ( http://hewgill.com/nwr/ ) 编写了类似您所描述的内容。它在 github 作为splitter.cpp并且有一个小手册页

splitter程序目前不支持动态更改输出程序集。启动命令时,输出程序是固定的。

于 2012-12-27T08:34:47.760 回答