使用libev的多线程套接字服务器

时间:2013-12-02 14:40:22

标签: multithreading sockets libev c10k

我正在实现套接字服务器。 所有客户(最多10k)都应该保持联系。

这是我目前的设计:

  1. 主线程创建一个事件循环(默认情况下使用epoll)和一个用于接受客户端的观察器。
  2. 接受回调
    • 接受fd并将其设置为非阻止模式。
    • 为fd添加观察程序以监控读取事件。
  3. 读取回调
    • 读取数据并将任务添加到线程池以发送响应。
  4. 将读取部分移动到线程池或任何其他更好的想法是否可以? 感谢。

1 个答案:

答案 0 :(得分:1)

很难说。您不希望在后台运行10k个线程。您应该将读取部分保留在主线程中。这样,如果突然所有客户端开始询问事物,那么只将这些资源堆积在线程池队列中(最终不会有10k个线程同时运行)。此外,您可以通过这种方式获得更好的性能,因为您避免进行一些不必要的上下文切换(在您自己的线程之间)。

另一方面,如果您的客户端不太可能同时发送请求,或者回复非常简单,那么每个客户端只有一个线程可能更简单,并且避免主线程和线程池。