产量提升::asio::协同作业,直到任务完成

Yield boost::asio::coroutine until task complete

本文关键字:任务 作业 asio      更新时间:2023-10-16

我正在构建一个简单的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处理程序