产量提升::asio::协同作业,直到任务完成
Yield boost::asio::coroutine until task complete
我正在构建一个简单的C++服务器,在那里我通过POST请求接收图像,将其发送到GPU进行处理,一旦我从GPU获得结果,就会发回响应。
为了能够处理许多同时连接(并学习一些新东西),我使用Boost::asio,遵循使用Boost::asico::coroutine的server4示例(链接)。我遇到的问题是如何在不阻塞协程的情况下将数据从协程发送到GPU。
当GPU能够一起处理一批请求时,它的效率最高。但是,即使一次处理一个请求(不能进行上下文切换,因为CPU和内存IO是瓶颈),它也必须在开始下一个请求之前处理完整的请求。这意味着我需要对来自协同程序的请求进行排队,并在GPU处理完成时以某种方式向协同程序发出信号。
一直在查看boost::asio参考,但没有任何东西向我袭来。一般来说,在无法立即生成响应的情况下(例如,可能需要约500ms),如何使用boost-asio协同程序。这通常是如何完成的?
设置程序中与GPU交互的部分,使其在自己的线程上运行。当您收到需要GPU的请求时,将图像数据、套接字对象和其他所需参数装箱,并将其推入(可能是互斥锁)队列。然后,gpu线程可以从队列中提取,执行其工作,然后在io_service上生成一个新任务,以使用存储在结构中的信息完成与客户端的事务。
gpu线程可以设置为睡眠,直到工作可用为止,使用条件变量,并在推送工作请求后让网络代码调用notify_one()。
另一个与您所描述的完全一样的技巧是设置一个具有无限截止日期的截止日期计时器,您可以在coro中等待(屈服)。
然后从GPU任务中取消工作完成的时间,恢复coro。
参见示例
- 为什么Boost.Asio不支持基于事件的接口(例如,类似条件变量信令的接口)
- 在执行cancel操作时,boost::asio::yield_text是否可以用作deadline_timer处理程序
相关文章:
- 将执行、作业和WinAPI相乘
- 为什么我的多线程作业队列崩溃
- 有没有任务栏API可以立即应用注册表更改
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 使用"Task"函数指针队列定义作业管理器
- C++秘密消息学校作业
- 动态类的分段错误(家庭作业问题)
- 如何创建线程序列以按照启动顺序执行任务?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- C++一个线程如何正确通信其任务已完成?
- CMAKE:动态作业池更改
- 在线程之间拆分任务总是值得的吗?
- 递归求和任务的错误答案
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- C++17 排序:作业左侧的后递增
- C++ 任务流库入门
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 不知道如何在家庭作业任务中实现一件事
- 产量提升::asio::协同作业,直到任务完成
- 回调作业队列中到达的任务