我正在编写一个基于Facebooks Proxygen的HTTP视频流媒体服务器。没有寻求计划。使用proxygen::ResponseBuilder
我能够将webm编码视频的块作为HTTP响应发送,即分块传输编码正在工作。我的问题是,Proxygen在发送响应头之前等待proxygen::ResponseBuilder::sendWithEOM()
。我想在每次调用proxygen::ResponseBuilder::send()
后实际发送数据。
我尝试使用evb->runInLoop()
和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()
的{{1}}方法调用的。我试图调用RequestHandler
而不将其包装到ResponseBuilder::send()
中,但是带有Folly v0.42.0的Proxygen v0.25.0禁止使用断言从另一个线程调用evb->runInLoop()
。我从这里删除了这个断言:https://github.com/facebook/folly/blob/v0.42.0/folly/io/async/EventBase.cpp#L491。
现在模拟的流媒体正在运行,但如果有并行请求,它就会崩溃。我想这并不意味着像这样使用,这就是断言的用途。但也许有人知道如何正确使用Proxygen基础设施用于我的用例?
答案 0 :(得分: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();
答案 1 :(得分: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源代码中评论断言。