0

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

一般的想法是:

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

纤维是否按照我的设想以这种方式工作?

这是使用 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();
4

2 回答 2

1

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

不,他们没有。

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

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

于 2018-03-30T23:17:34.220 回答
0

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

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;
}
于 2018-04-04T06:11:01.840 回答