Tom*_*Tom 11 c++ multithreading boost coroutine boost-asio
我正在构建一个基于TCP的守护进程,用于HTTP请求的预处理/后处理.客户端将连接到Apache HTTPD(或IIS),并且自定义Apache/IIS模块将请求转发到我的TCP守护程序以进行进一步处理.我的守护进程需要向上扩展(但不能向外)以处理大量流量,并且大多数请求都是小而短暂的.守护进程将使用C++构建,并且必须是跨平台的.
我目前正在研究增强的asio库,这看起来很自然.但是,我无法理解无堆栈协程与线程池模式的优点.具体来说,我在这里看HTTP服务器示例#3和HTTP服务器示例#4:http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html
尽管我所有的谷歌搜索,我都无法完全理解无堆栈协程服务器的优点,以及它如何相对于多核系统上的线程池服务器执行.
鉴于我的要求,两者中哪一个最合适?为什么?请随意"愚弄"你关于无堆叠协程想法的答案,我仍然在这里摇摇欲坠.谢谢!
编辑:另一个随机思考/关注讨论:Boost HTTP服务器示例#4被描述为" 使用无堆栈协程实现的单线程HTTP服务器 ".好的,所以它完全是单线程的(对吧?即使在父进程'分叉'给孩子之后?参见示例#4中的server.cpp)...单线程会成为多核系统的瓶颈吗?我假设任何阻塞操作都会阻止所有其他请求执行.如果确实如此,为了最大化吞吐量,我正在考虑基于协程的接收数据异步事件,我的内部阻塞任务的线程池(利用多核),然后是异步发送和关闭连接机制.同样,可扩展性至关重要.有什么想法吗?
我最近研究了多核机器上boost.asio的可扩展性.到目前为止的主要结论是它确实引入了开销,锁争用和其他上下文切换(至少在Linux上),请参阅我关于这些主题的一些博客文章:
我还在asio邮件列表上开了一个帖子,检查我没有错过任何明显的信息,请参阅http://comments.gmane.org/gmane.comp.lib.boost.asio.user/5133
如果您的主要关注点是性能和可扩展性,那么我担心,没有明确的答案 - 您可能需要进行一些原型设计并查看性能.
如果你有任何阻塞操作,那么你肯定想要使用多个线程 - 另一方面,上下文切换和锁争用会降低多线程的性能(至少你必须非常小心).
编辑:只是为了澄清无堆栈协同程序的东西:它本质上只是一些语法糖,使异步API看起来更像顺序/阻塞调用.
| 归档时间: |
|
| 查看次数: |
6316 次 |
| 最近记录: |