我正在编写一个基于 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 基础设施?