私はboost :: asioを使ってHttpサーバーを書いています。大きなファイルの場合、ファイル全体をメモリに読み込んでネットワークに送るのを避けるために、私はboost :: asio :: async_writeを使ってネットワーク上で送信する部分を読み込みます。boost :: async_write大きなファイルとメモリ消費
問題は、私のプロデューサ(ファイルから読み込む関数)がコンシューマ(boost :: asio :: async_write)よりもはるかに高速で、大きなファイルのメモリ消費量が大きいことです。
この問題を回避するには、バッファのリストを制限します。シンプルなプロデューサ/コンシューマの問題のように思えますが、その間にスレッドをブロックしたくありません。
私はboost :: io_serviceをn個のスレッドのスレッドプールで構成することができます。大規模なファイルに対するリクエストが多すぎる場合は、もうリクエストを処理していないサーバーで終了したくありません。
私の質問は です - どのようにスレッドをブロックせずにこのメカニズムを設計できますか? - リストのサイズをテストし、大きすぎる場合は、io_service :: postを実行してファイルを読み続けるデッドラインタイマーを生成しますか? - それを処理するより良い方法はありますか?
async_write経由でNバイトを送信しているとします。 async_writeを開始し、同時にファイルから次のNバイトを読み込みます(2つのタスクをポストします)。その後、async_writeが終了したら、同じことを繰り返します。したがって、まだ送信していないファイル部分はメモリに保持しません。 –