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

标签 multithreading sockets libev c10k

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

这是我目前的设计:

  1. 主线程创建一个事件循环(默认使用 epoll)和一个接受客户端的观察者。
  2. 接受回调
    • 接受fd并将其设置为非阻塞模式。
    • 为 fd 添加 watcher 以监视读取事件。
  3. 读取回调
    • 读取数据并向线程池添加任务以发送响应。

是否可以将读取部分移至线程池,或者其他更好的主意? 谢谢。

最佳答案

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

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

关于multithreading - 使用 libev 的多线程套接字服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20330907/

相关文章:

c# - 如何检查窗体是否打开了任何 ShowDialog() 窗体?

Java Socket 等待 UTF8

c - libev 循环在空闲时使用 99% 的 CPU

macos - 如何增加osx上套接字的限制以进行负载测试?

multithreading - 从持久性存储读取时,CPU核心是否繁忙?

c - Gcc 优化条件

multithreading - 停止由 QtConcurrent::run 启动的线程?

java - 在 Java Servlet 中限制 HTTP 请求

c# - 用于网络通信的良好 EOF 字节

c libev 未定义对 `ev_default_loop' 的引用