【问题标题】:boost asio multithreaded tcp server with thread pool使用线程池提升 asio 多线程 tcp 服务器
【发布时间】:2018-04-07 08:29:30
【问题描述】:

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

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

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

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

感谢您的帮助和指点。

【问题讨论】:

    标签: c++ multithreading boost boost-asio


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      你可以

      Q2:如果我使用单个IOS,有没有可能tcp数据的一部分去一个线程,而另一部分去另一个线程等等..这个理解正确吗?

      是的,存在竞争条件,但 boost.asio 支持 strand 来避免它。

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

      对我来说,没有找到更好的方法,如果找到了,告诉我或者过去这里,谢谢。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        相关资源
        最近更新 更多