多个 ASIO io_services 是好事吗?

Posted

技术标签:

【中文标题】多个 ASIO io_services 是好事吗?【英文标题】:Are multiple ASIO io_services a good thing? 【发布时间】:2011-08-28 16:03:57 【问题描述】:

我已经开始使用 Boost.ASIO 进行一些简单的网络编程,我对这个库的了解不是很多,所以请多多包涵。

目前在我的项目中,我只有 1 个 io_service 对象。用于所有异步 I/O 操作等。

我的理解是可以创建多个线程并将io_service实例的run方法传递给线程,从而为io_service提供更多线程。

我的问题:拥有多个 io_service 对象是否是好的设计?例如,有 2 个不同的 io_service 实例,每个实例关联 2 个线程,它们是否以某种方式相互了解(并因此相互合作),或者如果不是,它们是否会相互产生负面影响?

我的意图是让 1 个io_service 用于基于套接字的 I/O,另一个用于基于串行 (tty) 的 I/O。

【问题讨论】:

我认为每个应用程序有 1 个 io_service 并添加任意数量的线程来为操作提供服务会更好。 【参考方案1】:

我们使用多个 io_service 是因为我们应用程序中的某些组件需要以特定的固定优先级运行它们的所有工作线程,每个组件都不同。因此,每个组件都有自己的 io_service,每个组件都有自己的线程池执行run()

我可以想到的其他设计是,如果每个 IO 需要池中不同数量的线程,或者与您的情况更相关的是,如果池不能共享,例如,如果您的网络 IO可以取出每个线程并让您的串行 IO 等待。

【讨论】:

【参考方案2】:

IIRC,在Michael Caisse's Boostcon ASIO talk 期间(无论如何都值得一看),我相信这个问题是由一位观众明确提出的,并且可以作为一个潜在的解决方案。我认为这并没有错本身,并且可以根据您的设计以这种方式使用。

【讨论】:

链接说它还没有准备好被观看。每个人都收到那个错误信息吗? @Default:我也看到了同样的问题,在 youtube 上可以找到吗? 人力资源部。嗯,这与 2010 年 9 月 28 日 Boost Dev 邮件列表中的链接的结果相同,我当时看过。不知道为什么它坏了:( 部分幻灯片来自 ppt dl.dropbox.com/u/10282384/asio_presentation_with_story.pdf ***.com/a/6795367/333137 幻灯片现在可以在这里找到:cierelabs.com/slides/asio_presentation_with_story.pdf【参考方案3】:

这个讨论可能很有启发性:

http://thread.gmane.org/gmane.comp.lib.boost.asio.user/1300

我这里没有代码,但你为什么要使用多个 io_services? 我认为它使用了一个 io_service 和多个执行线程 那个 io_service。

IIUC,每个 io_service 都有一个 select/epoll/whatever 队列,所以有多个 io_services 类似于拥有多个独立的 select/epoll 循环。在一些 情况,例如。大量的插槽和多个 CPU,这可能会有所帮助。

我不太确定的是多个线程都在运行 io_service::run(具有相同的 io_service)。我认为这只是意味着 处理程序同时运行,而 select/epoll/etc.循环是“共享的”。 我认为这最适合您的处理程序运行时间相对较长时 操作。

【讨论】:

以上是关于多个 ASIO io_services 是好事吗?的主要内容,如果未能解决你的问题,请参考以下文章

对于带有单个接受器的线程 boost::asio 服务器,我们是不是需要每个线程多个 io_service

提升ASIO IO_SERVICE实施?

boost::asio 在线程中启动不同的服务?

C++ - 几个 Boost.Asio 相关问题

Boost.Asio网络库之io_service分析

Boost.Asio网络库之io_service分析