带有 libevent 的多线程 HTTP 服务器

Posted

技术标签:

【中文标题】带有 libevent 的多线程 HTTP 服务器【英文标题】:Multi-threaded HTTP server with libevent 【发布时间】:2013-12-06 14:25:25 【问题描述】:

我正在尝试使用 libevent 完成一个简单的 HTTP 服务器,并根据文档示例设法完成它。然而,没有线程,libevent 的全部目的就是垃圾。我对 C++11 中的线程不是很有经验,但我很想知道如何正确实现这样的服务器。

我在网上找到了这个例子:https://gist.github.com/kzk/665437

这是正确的吗? pthreads 是正确的选择吗?另外,这条线很奇怪:

for (int i = 0; i < nthreads; i++) 
    pthread_join(ths[i], NULL);

那里发生了什么?

【问题讨论】:

您应该阅读如何处理多个客户的策略。每个客户端一个线程可能不是最佳的。 kegel.com/c10k.html#strategies 另外,如果你想使用线程并且你正在使用 C++11,你可以看看这里:en.cppreference.com/w/cpp/thread/thread。 "那里发生了什么?" -- 这 3 行加入线程而不关心它们的退出代码。换句话说,服务器主进程一直等到它们全部完成。 那么,上面的代码并没有真正的可扩展性,是吗? 实际上gist.github.com/kzk/665437 中的代码在可扩展性方面相当不错:它使用有限数量的线程和 libevent 实例(每个线程一个)以便更好地利用 CPU,而每个 libevent 实例都是异步的维护来自 HTTP 客户端的大量连接。类似于 libevhtp 对 evthr 所做的事情。 【参考方案1】:

我还不能推荐 libevhtp,因为 serious bug,但您可能想看看他们如何使用线程:https://github.com/ellzey/libevhtp/blob/master/examples/thread_design.c - 他们正在创建单独的 libevent 实例,每个线程一个。只要您小心在线程中使用相同的 libevent 库,所有异步代码都将无需额外的锁等即可工作。 IMO 它是典型 Web 服务器的 libevent 主题化的最佳方法。

至于https://gist.github.com/kzk/665437,c++11线程应该不会比pthread差。

【讨论】:

它们是不同语言的不同标准。 我明白了。尽管它有这个严重的错误,但似乎是一个很好的开始工作的基础! libevent http 服务器也不知道如何使用 HTTP 管道,顺便说一句,所以你不应该使用 libevent 或 libevhtp 作为前端服务器。虽然当客户端尝试通过管道传输 HTTP 请求时,libevent http 服务器可能会以更优雅的方式失败 - 我自己还没有尝试过。

以上是关于带有 libevent 的多线程 HTTP 服务器的主要内容,如果未能解决你的问题,请参考以下文章

libevent 源码学习二 —— reactor 模式

带有线程池服务器python的套接字

记一个多线程使用libevent的问题

libevent evhttp多线程

libevent evhttp多线程

libevent evhttp多线程