【问题标题】:Multi-threaded HTTP server with libevent带有 libevent 的多线程 HTTP 服务器
【发布时间】: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 所做的事情。

标签: c++ http c++11 libevent


【解决方案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 服务器可能会以更优雅的方式失败 - 我自己还没有尝试过。
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2022-01-23
  • 2012-12-14
  • 2011-08-06
相关资源
最近更新 更多