首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Proxygen和Folly发送HTTP块响应来模拟视频流?

如何使用Proxygen和Folly发送HTTP块响应来模拟视频流?
EN

Stack Overflow用户
提问于 2015-06-15 14:02:43
回答 2查看 1.2K关注 0票数 2

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

我尝试使用ResponseBuilder和evb->runInEventBaseThread()运行从EventBaseThread执行的lambda中的evb->runInLoop()调用。

代码语言:javascript
复制
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()方法RequestHandler调用的。我试图调用ResponseBuilder::send()而不将它包装到evb->runInLoop()中,但是Proxygenv0.25.0与FollyV0.42.0一起禁止使用断言从另一个线程调用ResponseBuilder::send()。我从这里删除了这个断言:https://github.com/facebook/folly/blob/v0.42.0/folly/io/async/EventBase.cpp#L491

现在模拟的流正在工作,但是如果有并行请求,它就会崩溃。我想它不应该像这样使用,这就是断言的意义所在。但是,也许有人知道如何正确地使用Proxygen基础设施来实现我的使用呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-26 19:50:18

同样的问题。我让它和这样的东西一起工作。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-08-11 12:11:56

代码语言:javascript
复制
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源代码中评论断言。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30847200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档