データがどこにもバッファリングされず、ストリームの送信元のアプリケーションがストリームを読み取っていない場合でもブロックされないように、1 つのプログラムから未定義の数のプログラムに出力をストリーミングするにはどうすればよいですか?最初に言及されたプログラムからの出力がない場合、ストリームを読み取るプログラムはブロックしますか?
しばらくの間、Google を試してみましたが、何もストリームを読み取っていない場合にプログラムがブロックする方法しか見つかりませんでした。
データがどこにもバッファリングされず、ストリームを読み取るものがなくてもストリームの発信元のアプリケーションがブロックされないように、1 つのプログラムから未定義の数のプログラムに出力をストリーミングするにはどうすればよいですか?
前述の要件は、何らかの形式のバッファーなしでは満たすことができない可能性があります。
最も簡単なオプションは、出力をファイルに書き込み、消費者がそのファイルを読み取れるようにすることです。
もう 1 つのオプションは、メモリ マップ ファイルの形式でリング バッファを使用することです。通常、リングバッファの容量は固定されているため、低速のコンシューマを処理するためのポリシーが必要です。オプションは次のとおりです。プロデューサーをブロックします。遅いコンシューマーを終了します。遅いコンシューマーがデータを失ったときに何らかの方法で回復できるようにします。
どのような種類のデータについて話しているのか (データの大きさ、形式など) を正確に知らなければ、具体的な答えを導き出すことは困難です。たとえば、証券取引所で株を購入するための情報を送信する「ティッカーテープ」アプリケーションが必要だとします。各アプリケーションからソケットを受け入れ、スレッドを開始し、関連データをそのまま送信するサーバーを簡単に作成できます。株式市場のレコーダーから現れます。今日存在する「マルチプレクサ」については知りません(ただし、Gregのものは出発点かもしれません)。(たとえば) XML を使用してデータをパッケージ化する場合、パケットの後半を送信できますが、クライアント コードはそれが完全ではないことを検出し、破棄します。
一方、全国の詳細なライブ更新天気図を送信している場合、データはおそらく十分に大きいため、完全に新しい天気図が到着するのを待ちたくないので、何らかの種類の天気図が必要です。現在の更新されたマップを設定し、(たとえば) 1 分後に新しいマップが作成されるまで、そのマップを送信する lock'n'load プロトコル。繰り返しますが、これを行うコードを書くのはそれほど複雑ではありませんが、データのパケットが大きく、「半分のパケット」を取得するのは非常に無駄であり、完全に役に立たない。
2016 年のブラジル オリンピックのライブ ビデオをストリーミングしている場合、ビデオではタイミングがすべてであり、クライアントがバッファリングし、キー フレームを取得し、「古い」フレームを破棄する必要があるため、おそらくさらに異なるソリューションが必要です。など、サーバーは異なる必要があります。