2

我正在编写一个基于 Facebooks Proxygen 的 HTTP 视频流服务器。没有计划的寻求。使用proxygen::ResponseBuilder我能够将 webm 编码的视频块作为 HTTP 响应发送,即分块传输编码正在工作。proxygen::ResponseBuilder::sendWithEOM()我的问题是,Proxygen甚至在发送响应标头之前都会等待。我希望它在每次调用proxygen::ResponseBuilder::send().

evb->runInLoop()我尝试使用和从 EventBaseThread 执行的 lambda 运行 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 回答