Boost.Fiber是否会自动产生网络请求,例如通过网络进行数据库调用?

时间:2018-03-30 16:51:12

标签: c++ c boost fiber

Boost.Fiber是否自动屈服于网络请求(如果我理解他们在I / O期间产生CPU),例如通过网络进行数据库调用?我想用它来设置阻塞数据库调用,我在这里插入大量信息,并且在收到它们时需要插入许多小记录。我的另一个选择是用于微线程的libdill / libmill。

一般的想法是:

  1. 接收数据
  2. 创建光纤并将数据传递给
  3. fiber获取数据库连接并发送INSERT查询(带postgres的libpqxx)
  4. 其他光纤在数据库查询处于运行状态时运行并可以访问数据库
  5. 查询从数据库返回,执行错误处理和处理响应
  6. 纤维是否像我设想的那样以这种方式工作?

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

    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();
    

2 个答案:

答案 0 :(得分:1)

  

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

不,他们没有。

你似乎正在寻找的是Boost Coroutines,结合Boost Asio用于异步IO。他们屈服。

有利用Asio进行异步执行的数据库操作库(例如Amy)或WebSockets(例如Boost Beast

答案 1 :(得分:0)

boost.fiber确实与boost.asio集成 - 你需要install a special scheduler - 在boost.fiber /子目录示例中提供了示例。)

public interface Foo {
    default int getValue() {
        return 1;
    }
}

public interface Bar {
    default int getValue() {
        return 2;
    }
}

public class Impl implements Foo, Bar {
    @Override
    public int getValue() {
        return Bar.super.getValue();
    }
}