首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Boost.Fiber是否会自动产生网络请求,例如网络上的数据库调用?

Boost.Fiber是否会自动产生网络请求,例如网络上的数据库调用?
EN

Stack Overflow用户
提问于 2018-03-30 16:51:11
回答 2查看 890关注 0票数 0

Boost.Fiber是否会自动产生网络请求(如果我理解正确的话,它们会在I/O期间产生CPU ),例如网络上的数据库调用?我想用它来设置阻塞的数据库调用,在其中我插入了大量的信息,并且在接收到这些信息时需要插入大量的小记录。我的另一个选择是libdill/libmill进行微线程处理。

总的想法是:

  1. 接收数据
  2. 创建光纤并将数据传递给它
  3. 光纤获取数据库连接并发送插入查询(带有postgres的libpqxx)
  4. 当数据库查询运行时,其他光纤运行并可以访问数据库。
  5. 从数据库返回查询,执行错误处理和进程响应

纤维的工作方式和我想象的一样吗?

这是使用RapidJSON和boost.fiber的代码的简化基本结构,但我从网络(Websocket)获得消息:

代码语言:javascript
运行
复制
inline
void doDatabaseCall( Document &msg ) {
     //Get connection & do query with libpqxx
}

Document msg;
msg.Parse( "{\"myVar\": \"test\"}" );
Document msg2;
msg2.Parse( "{\"myVar\": \"test2\"}" );
boost::fibers::fiber f1( doDatabaseCall, msg);
boost::fibers::fiber f2( doDatabaseCall, msg2);
f1.join();
f2.join();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-30 23:17:34

Boost.Fiber是否会自动产生网络请求(如果我理解正确的话,它们会在I/O期间产生CPU ),例如网络上的数据库调用?

不,他们没有。

您似乎要寻找的是Boost Coroutines,以及用于异步IO的Boost Asio。他们会屈服的。

有一些数据库操作库利用Asio进行异步执行(例如艾米)或WebSockets (例如助推野兽)

票数 1
EN

Stack Overflow用户

发布于 2018-04-04 06:11:01

boost.fiber确实与boost.asio集成-您需要安装一个特殊的调度程序 -示例在boost.fiber /子目录示例中提供)。

代码语言:javascript
运行
复制
int main( int argc, char* argv[]) {
    try {
        std::shared_ptr< boost::asio::io_service > io_svc = std::make_shared< boost::asio::io_service >();
        boost::fibers::use_scheduling_algorithm< boost::fibers::asio::round_robin >( io_svc);

        // server
        tcp::acceptor a( * io_svc, tcp::endpoint( tcp::v4(), 9999) );
        boost::fibers::fiber( server, io_svc, std::ref( a) ).detach();

        // client
        const unsigned iterations = 2;
        const unsigned clients = 3;
        boost::fibers::barrier b( clients);
        for ( unsigned i = 0; i < clients; ++i) {
            boost::fibers::fiber(
                    client, io_svc, std::ref( a), std::ref( b), iterations).detach();
        }
        io_svc->run();

        std::cout << "done." << std::endl;
        return EXIT_SUCCESS;
    } catch ( std::exception const& e) {
        print("Exception: ", e.what(), "\n");
    }   
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49578241

复制
相关文章

相似问题

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