产量提升:: asio :: coroutine直到任务完成

时间:2017-01-15 19:23:57

标签: c++ boost boost-asio coroutine

我正在构建一个简单的C ++服务器,我通过POST请求接收图像,将其发送到GPU进行处理,一旦我从GPU获得结果,就发回响应。

为了能够处理多个同时连接(以及学习新东西),我正在使用Boost :: asio,遵循使用boost :: asio :: coroutine的server4示例(link)。我遇到的问题是如何在不阻止协程的情况下将数据从协程发送到GPU。

当GPU可以一起处理一批请求时,它是最有效的。但即使一次处理一个请求(不能作为CPU和内存IO进行上下文切换是瓶颈),它必须在开始下一个请求之前处理完整的请求。这意味着我需要对来自协同程序的请求进行排队,并在GPU处理完成时以某种方式发出协同信号。

正在查看boost :: asio参考文献,但没有任何内容正在跳出来。一般来说,如果不能立即生成响应(例如可能需要约500毫秒),如何使用增强asio协同程序。这通常是怎么做的?

2 个答案:

答案 0 :(得分:0)

设置与GPU交互的程序部分,以在其自己的线程上运行。当您收到需要GPU的请求时,请将图像数据以及套接字对象和其他所需参数打包,并将其推入(可能是互斥锁定的)队列。然后,gpu线程可以从队列中拉出,执行其工作,然后在io_service上生成一个新任务,以使用存储在结构中的信息完成与客户端的事务。

可以将gpu线程设置为sleep,直到使用condition variable工作可用,并且在推送工作请求后网络代码调用notify_one()。

答案 1 :(得分:0)

另一个与你描述完全相同的技巧是设置一个截止时间计时器,它有一个无限期限,你可以在coro(屈服)中等待。

然后从GPU任务中取消工作完成的时间,恢复coro。

参见例如