boost::asio 在线程中启动不同的服务?
Posted
技术标签:
【中文标题】boost::asio 在线程中启动不同的服务?【英文标题】:boost::asio starting different services in threads? 【发布时间】:2011-03-19 00:12:28 【问题描述】:似乎所有示例总是显示在所有线程中运行相同的 io_service。
你能启动多个 io_services 吗?这是我想做的:
在主线程中启动io_service A来处理用户输入...
在另一个线程中启动另一个io_service B,然后可以启动一堆worker 线程都共享 io_service B。
io_service A 上的用户可以在 io_service B 上“发布”工作,以便在工作池上完成,但不会在 io_service A 上完成任何工作,即主线程。
这可能吗?这有意义吗?
谢谢
【问题讨论】:
【参考方案1】:根据我的经验,如果每个 cpu 或每个进程一个 io_service
性能更好,这真的取决于应用程序。几年前在asio-users 邮件列表上就这个话题进行了讨论。
Boost.Asio 文档在 HTTP Server 2 和 HTTP Server 3 示例中有一些很好的示例 showing these two 技术。但请记住,第二个 HTTP 服务器只是展示了如何使用这种技术,而不是何时或为什么使用它。这些问题需要通过分析您的应用程序来回答。
一般来说,使用 Boost.Asio 创建应用程序时应该使用以下顺序
-
单线程
具有单个
io_service
的线程池
具有某种 CPU 关联性的多个 io_service
对象
【讨论】:
+1 有趣的讨论 :),虽然我还没有遇到任何问题,但让我对我的系统设计感到好奇。 情况是这样,我有一个应用程序,它有一个线程和一个处理套接字和 stdio 的 io_service,它是旧的非线程保存代码。现在我想添加一个工作线程池,它有自己的 io_service 并且不会与主线程上的非线程安全代码交互。工作池将在单独的数据上运行一些单独的代码,并且通信将通过主 io_service 和线程池中运行的 io_service 之间的 io_service 帖子进行。听起来这样可以吗? @Oliver 是的,听起来可以做到。不过,如果这是我的任务,我会用 strands 修复非线程安全代码,并使用单个 io_service 和调用 io_service::run() 的线程池。【参考方案2】:好问题!
是的,这是可能。在我目前正在处理的应用程序中,我已将应用程序分解为负责系统不同方面的单独组件。每个组件在自己的线程中运行,有自己的一组计时器,使用 asio 进行自己的网络 I/O。从可测试性/设计的角度来看,它对我来说似乎更干净,因为没有组件可以干扰另一个组件,但我需要得到纠正。我想我可以重写作为参数传入 io 服务的所有内容,但目前还没有发现需要这样做。
所以回到你的问题,你可以做任何你想做的事,IMO 更多的是尝试一下,如果遇到任何问题就改变它。
另外,您可能想看看 Sam Miller 在 WRT 处理用户输入的另一篇文章中指出的内容(也就是说,如果您使用的是控制台):https://***.com/questions/5210796/boost-asio-how-to-write-console-server
【讨论】:
+1 用于链接到我的答案,显示 posix::stream_descriptor 用法。以上是关于boost::asio 在线程中启动不同的服务?的主要内容,如果未能解决你的问题,请参考以下文章
从多个线程调用 boost::asio::io_service 运行函数