【问题标题】:Boost Asio, io_service handles only one socket per coreBoost Asio,io_service 每个核心只处理一个套接字
【发布时间】:2011-07-05 10:47:38
【问题描述】:

我正在使用 Boost Asio 编写服务器应用程序:

  1. 服务器:从线程池运行 io_service.run()(每个内核一个线程),接受连接和从套接字读取数据是异步完成的。
  2. 客户端:每个客户端连接并向服务器发送一个大文件 (~500MB)。

问题:所有客户端都连接到服务器(客户端数>服务器核心数); io_service 每个线程只处理一个连接/套接字,而来自其他套接字的数据在一个已处理的连接完成之前不会被处理。

我希望来自所有已连接套接字的数据同时由 io_service 线程池处理?

【问题讨论】:

    标签: sockets concurrency boost-asio boost-thread


    【解决方案1】:

    预期的行为是什么?如果您有n 线程调用io_service::run(),您的io_service 只能调用n 处理程序。如果未完成的异步操作的数量大于n,它们的处理程序将在io_service 队列中等待,直到有线程可以调用它们。

    【讨论】:

    • 我希望来自所有连接客户端的数据都由线程池处理(以较低的速率),而不是简单地阻止所有其他客户端等待一个线程空闲。这意味着一个连接在整个数据传输过程中只占用一个线程,即使我从套接字异步读取数据(这实际上是我正在经历的)。我是不是搞错了什么?
    • @Aldin 你如何确定一个连接占用一个调用io_service::run() 的线程?
    • 我在我的 connection::handle_read() 函数(服务器端)中添加了一条日志消息,它打印连接远程端点的端口号,并且我只读取前两个连接(io_service thread pool = 2),而其他连接被阻塞(无日志消息),直到前两个连接之一完成,这可能需要一些时间,因为正在传输大文件。
    • @Aldin 你是使用async_read 组合操作,还是async_read_some?
    • @Aldin 您可能应该编辑您的问题并添加一些代码来显示您如何调用async_read_some,这很可能与您遇到的行为有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2011-06-16
    • 2014-01-24
    • 2017-09-17
    • 2012-11-26
    • 2011-12-18
    相关资源
    最近更新 更多