如何使用 boost::beast 避免回调地狱?

问题描述 投票:0回答:1

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

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

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

然而,这可能会创建一个繁忙的循环,其中主线程在不断运行状态机的同时消耗 100% 的 cpu?

我的推理正确吗?使用像 post() 这样的东西来排队一个可以推进状态机的函子会更好吗?

boost boost-asio boost-beast beast-websockets
1个回答
1
投票

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

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

事实证明 Boost Asio 具有类似于 Node.js 的“async/await”的功能。它称为 Boost Asio Coroutines,您可以按照与 Node.js 'async/await' 完全相同的方式实现它。

不确定运行消耗 100% 线程的 while 循环是否是个好主意?当有更好的解决方案时,这有点浪费。

© www.soinside.com 2019 - 2024. All rights reserved.