【发布时间】:2012-05-20 04:36:29
【问题描述】:
我正在构建一个基于 TCP 的守护进程,用于 HTTP 请求的预处理/后处理。客户端将连接到 Apache HTTPD(或 IIS),并且自定义 Apache/IIS 模块会将请求转发到我的 TCP 守护程序以进行进一步处理。我的守护进程需要扩展(但不是扩展)以处理大量流量,并且大多数请求都是小而短暂的。守护进程将使用 C++ 构建,并且必须是跨平台的。
我目前正在研究 boost 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)……单线程会成为多核系统的瓶颈吗?我假设任何阻塞操作都会阻止所有其他请求执行。如果确实如此,为了最大限度地提高吞吐量,我正在考虑一个基于协程的接收数据异步事件,一个用于我的内部阻塞任务的线程池(以利用多核),然后是一个异步发送和关闭连接机制。同样,可扩展性至关重要。有什么想法吗?
【问题讨论】:
-
Query:我想我理解“扩大规模”。什么是“向外扩展”?
-
有些人发现协程方法更易于阅读/实现,因为代码是从上到下阅读的。它们更适合流式解析,因为一旦输入中断后再次开始使用流,您就不必担心从上次中断的地方继续。
-
@avid -- 谢谢,我在 boost HTTP 服务器示例 #4 中看到了他们是如何使用请求解析器做到这一点的。毫无疑问,这非常好,但我更关心性能而不是编码/实现的容易程度。您对此有何看法?
-
@Rob - 通过“横向扩展”,我的意思是添加额外的机器并在它们之间分配负载(我认为我不需要;我的用户将添加另一个 Web 服务器节点和另一个我的应用在后台的实例,我的应用不需要支持网络农场)
-
@TomC:是的。无堆栈协程示例上下文中的“分叉”与线程无关。它看起来像传统的 fork 操作,但协程不是线程。我没有使用 asio 协程的东西,但我认为它主要是为了可读性,即使事件驱动的代码更具可读性。这些并不是真正的提升的一部分,它们只是在 asio 示例中,在此处查看更多信息:blog.think-async.com/2009/07/…
标签: c++ multithreading boost boost-asio coroutine