boost - 如何使用 boost::beast 避免回调地狱?
问题描述
我正在开发一个我想在其中使用 boost::beast/asio 的应用程序。我需要通过 websocket 连接接收数据并同时向 REST API 发出请求。
在 boost::beast websocket/HTTP 异步客户端示例中,似乎下一个异步操作是在完成处理程序中启动的。这似乎引发了我在 node.js 应用程序中看到的相同的“回调地狱”。
为了避免这种情况,我正在考虑在我的应用程序中使用一个简单的状态机来决定接下来要开始什么操作。我正在考虑在我的应用程序中有一个 while 循环,我在 io_context 上调用 poll() 之后我运行我的状态机代码(例如 switch(state) { ... state = nextState; } )
然而,这可能会创建一个繁忙的循环,其中主线程在不断运行状态机的同时消耗 100% cpu?
我的推理是否正确,使用 post() 之类的东西来排队一个可以推进状态机的函子会更好吗?
解决方案
我希望我可以将此作为评论留下,因为它并不是一个完整的答案,但我没有足够的声誉发表评论。
如果您在谈论 node.js,我假设您对“promises”和/或更新的“async/await”有一定的经验——至少 node.js 是这样避免回调地狱的。
原来 Boost Asio 有一些类似于 node.js 'async/await' 的东西。它被称为 Boost Asio Coroutines,你实现它的方式与 node.js 'async/await' 完全相同。
不确定运行消耗 100% 线程的 while 循环是否是个好主意?当有更好的解决方案时,这有点浪费。
推荐阅读
- c++ - 让独立的 shared_ptrs 指向同一个对象是否合法?
- php - 使用 PHP Explode 解析消息体
- java - List.indexOf() 与我的班级的自定义 equals() 返回 -1
- google-cloud-platform - G-storage bucket:如果a,web UI,文件上传被取消,重新上传,文件会被覆盖,还是重复?
- c++ - 如何调用类函数但使用不同的类对象
- android - 为什么 Flutter 构建失败并出现错误无法解析配置“:app:debugRuntimeClasspath”的所有文件
- css - 位置:粘在css网格中?
- html - 选择输入大于引导程序 4 中的输入字段
- botframework - 对 botframework 的多个 Slack 通道支持
- python-3.x - 如果 glmnet 确实需要浮点数,为什么当我提供浮点数时 glmnet.py 会在 cvglmnet 上抛出 TypeError?