如何避免通过boost :: beast回调地狱?

时间:2019-01-11 19:32:09

标签: boost boost-asio boost-beast beast-websockets

我正在开发要使用boost :: beast / asio的应用程序。我需要通过websocket连接接收数据,并同时向REST API发出请求。

在boost :: beast websocket / HTTP异步客户端示例中,似乎下一个异步操作已在完成处理程序中启动。这似乎引起了我在node.js应用程序中看到的相同的“回调地狱”。

为避免这种情况,我正在考虑在我的应用程序中使用一个简单的状态机来决定接下来要开始的操作。我正在考虑在我的应用程序中有一个while循环,在io_context上调用poll(),然后运行状态机代码(例如switch(state){... state = nextState;})

但是,这可能会导致一个繁忙的循环,在该循环中主线程不断运行状态机时消耗100%的cpu?

我的推理是正确的吗?使用post()之类的函数来使状态机前进会更好吗?

2 个答案:

答案 0 :(得分:1)

我希望我可以留下评论,因为它并不是一个完整的答案,但是我没有足够的声誉来发表评论。

如果您在谈论node.js,我假设您对'promises'和/或较新的'async / await'有一定的经验-至少这是node.js避免回调地狱的方式。

结果证明,Boost Asio具有类似于node.js'async / await'的功能。它称为Boost Asio Coroutines,您可以通过与node.js'async / await'完全相同的方式来实现它。

不确定运行消耗100%线程的while循环是否是一个好主意?如果有更好的解决方案,那就太浪费了。

答案 1 :(得分:0)

  

在boost :: beast websocket / HTTP异步客户端示例中,似乎下一个异步操作已在完成处理程序中启动

Beast附带了许多不同的示例,每个示例都演示了一种执行异步操作的方法,例如,以下是使用堆栈式协程的版本: https://github.com/boostorg/beast/blob/cfd9b460144a145f363c90533dc7c29dd1e1150d/example/websocket/server/coro/websocket_server_coro.cpp

这里是使用无堆栈协程的一种: https://github.com/boostorg/beast/tree/cfd9b460144a145f363c90533dc7c29dd1e1150d/example/websocket/server/stackless

您没有看到这些吗?文档的本页上描述了所有示例: https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/examples.html