【发布时间】:2012-01-08 14:34:20
【问题描述】:
我已经阅读了C10K 文档以及许多有关扩展套接字服务器的相关论文。所有的道路都指向以下:
避免“每个连接线程”的经典错误。
首选 epoll 而不是 select。
同样,unix 中的传统异步 io 机制可能难以使用。
我的简单 TCP 服务器仅在专用端口上的侦听套接字上侦听客户端连接。收到新连接后,解析请求,然后发回响应。然后优雅地关闭套接字。
我认为我对如何使用 epoll 在单个线程上扩展它有很好的了解。只有一个循环调用 epoll_wait 用于侦听套接字以及现有的客户端连接。返回后,代码将根据刚刚收到信号的套接字来处理新的创建新客户端连接以及管理现有连接的状态。也许还有一些逻辑来管理连接超时、套接字的优雅关闭以及每个连接的有效资源分配。看起来很简单。
但是如果我想扩展它以利用多个线程和多个 cpu 内核呢? 我想到的核心思想是:
一个专用线程,用于侦听 TCP 侦听套接字上的传入连接。然后是一组 N 个线程(或线程池)来处理所有活动的并发客户端连接。然后发明一些线程安全的方式,让监听线程将新连接(套接字)“分派”到可用的工作线程之一。 (Windows 中的 IOCP)。工作线程将在它正在处理的所有连接上使用 epoll 循环来执行单线程方法会执行的操作。
我在正确的轨道上吗?或者是否有一个标准的设计模式可以在多个线程上使用 epoll 来做一个 TCP 服务器?
关于监听线程如何将新连接分派到线程池的建议?
【问题讨论】:
-
如果您选择的语言很灵活,您可能想尝试vibed.org,它抽象了异步编程的异步特性,因此您仍然可以以同步方式进行编程。例如ubyte[] buf = 新 ubyte[](1024);自动数据 = conn.read(buf); conn.write(data);