繁体   English   中英

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

[英]boost asio multithreaded tcp server with thread pool

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

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

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

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

感谢您的帮助和指示。

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

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

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

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

你可以

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

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

Q3:还有其他更好的方法吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM