2

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 インフラストラクチャを適切に使用する方法を誰かが知っているでしょうか?

4

2 に答える 2

1

それは同じ問題を抱えています。私はそれをこのようなもので動作させました。

folly::EventBase* eventBase = folly::EventBaseManager::get()->getExistingEventBase();
thread t([&, eventBase]() {
    while( chunks exist ) {
        auto chunk = getChunk();    
        eventBase->runInEventBaseThread([&, chunk=chunk]() mutable {
            ResponseBuilder(downstream_).body(move(chunk)).send();
        });
    }
});
// sendWithEOM ...
t.detach();
于 2015-11-26T19:50:18.447 に答える
0
using namespace folly;
using namespace proxygen;

//Get Event Base in worker thread and pass it to new thread. If you call this inside new thread then you won't get worker thread's event base.
EventBase* evb = EventBaseManager::get()->getExistingEventBase();   
std::thread t([&, evb](){

// send headers ...
while ( chunks avail. ) {
    //...
    evb->runInLoop([&](){
        ResponseBuilder(downstream_)
                 .body(std::move(chunk))
                 .send();
    });
    //... 
}
// sendWithEOM ...
});
t.detach();

そのため、EventBase ソースでアサーションをコメントする必要はありません。

于 2015-08-11T12:11:56.633 に答える