使用线程池增强asio多线程tcp服务器

时间:2018-04-07 08:29:31

标签: c++ multithreading boost boost-asio

我有一个使用boost asio编写的单线程异步tcp服务器。每个传入的请求都将经历几个处理步骤(同步和异步),最后使用异步写入发回响应。

对于具有10个并发请求的小型负载,它可以正常工作。但是,当我使用100的并行度进行测试时,事情开始恶化。随着时间的推移,响应延迟开始增加。所以,我想尝试一些多线程处理来处理请求。

我正在寻找一个体面的例子/帮助来创建和运行多个线程,以便异步读/写客户端。我有以下疑问:

  1. 我应该使用单个IOS对象并在线程池的所有线程中调用其run方法,还是应该为每个线程使用单独的IOS?
  2. 如果我使用单个IOS,是否有可能部分tcp数据转到一个线程,而另一个部分转到另一个线程等等。这种理解是否正确?
  3. 还有其他更好的方法吗?
  4. 感谢您提供任何帮助和指示。

2 个答案:

答案 0 :(得分:1)

没有看到你的代码,我只能猜出出了什么问题。很可能你在异步完成处理程序中运行长时间的操作。完成处理程序应该是快速的 - 获取数据,将其交给进行进一步处理,完成。

作为第一优先级,我将完全异步并在线程池中运行所有处理。您可以找到一个示例here,其中为每个新客户端启动一个新线程,您可以将其替换为线程池。

使用一个io_service。单个io_service可以处理很多的并行性,前提是不要在完成处理程序中延迟它。这简化了实现,因为您不必担心并行运行的完成处理程序,如果您在多个线程中运行多个IOS,就会发生这种情况。

答案 1 :(得分:1)

Q1:我应该使用单个IOS对象并在线程池的所有线程中调用其run方法,还是应该为每个线程使用单独的IOS?

你可以

Q2:如果我使用单个IOS,是否有可能部分tcp数据转到一个线程,而另一个部分转到另一个线程等等。这种理解是否正确?

是的,有竞争条件,但是boost.asio支持 strand 以避免它。

问题3:还有其他更好的方法吗?

对我来说,找不到更好的方法,如果你找到,告诉我或过去,谢谢你。

顺便说一句,正如@rustyx所说,你的程序在同步调用时被阻止,转向全异步调用会有所帮助。