Facebooks Proxygen に基づいて HTTP ビデオ ストリーミング サーバーを作成しています。シークの予定はありません。を使用してproxygen::ResponseBuilder
、webm エンコードされたビデオのチャンクを HTTP 応答として送信できます。つまり、チャンク転送エンコーディングが機能しています。proxygen::ResponseBuilder::sendWithEOM()
私の問題は、応答ヘッダーを送信する前にProxygen が待機することです。を呼び出すたびに、実際にデータをできるだけ早く送信したいと思いますproxygen::ResponseBuilder::send()
。
evb->runInLoop()
とを使用して EventBaseThread から実行されたラムダから ResponseBuilder 呼び出しを実行しようとしましたevb->runInEventBaseThread()
using namespace folly;
using namespace proxygen;
std::thread t([&](){
EventBase* evb = EventBaseManager::get()->getExistingEventBase();
// send headers ...
while ( chunks avail. ) {
//...
evb->runInLoop([&](){
ResponseBuilder(downstream_)
.body(std::move(chunk))
.send();
});
//...
}
// sendWithEOM ...
});
t.detach();
このコードはonRequest()
my のメソッドから呼び出されRequestHandler
ます。ResponseBuilder::send()
にラップせずに呼び出してみましevb->runInLoop()
たが、Folly v0.42.0 を使用する Proxygen v0.25.0 はResponseBuilder::send()
、アサートを使用した別のスレッドからの呼び出しを禁止しています。ここからこのアサートを削除しました: https://github.com/facebook/folly/blob/v0.42.0/folly/io/async/EventBase.cpp#L491。
エミュレートされたストリーミングが機能するようになりましたが、並列リクエストがあるとクラッシュします。このように使用することを意図したものではなかったと思います。それがアサートの目的です。しかし、私のユースケースで Proxygen インフラストラクチャを適切に使用する方法を誰かが知っているでしょうか?