我试图学习如何使用epoll来创建一个从客户端获取和执行命令的服务器(登录,下载文件等)。到目前为止,我已经让程序简单地向客户端发送它收到的所有数据,但我注意到当我尝试实现我列出的命令时,服务器一次只能处理一个请求。
我试图提出一种有效的方法,我可以同时处理许多命令。到目前为止,我提出的唯一想法是创建一个单独的线程来处理每个请求,但我不确定这是否是最佳解决方案。处理这个问题的好方法是什么?
答案 0 :(得分:1)
如果您的体系结构是epoll +单线程,那么如果您的命令负载很重,它会有一些阻塞问题。这就是为什么当某个命令阻塞时redis的性能会下降。
还有其他架构可行。但在尝试之前,请先进行一些性能测试。如果redis可以在单个线程中执行数百万OPS,那么您也可以这样做。
每个线程的epoll +命令:就像你说的那样。但是线程创建和销毁会在负载上升时增加成本。频繁上下文切换也是一个很大的问题。
epoll +线程池:样例构思。但没有上述缺点。
基于epoll的听众+ N *(epoll worker):这是一个有趣的结构。 epoll侦听器将从用户获得请求,但不是将作业直接分配给线程,而是将文件描述符注册到后续worker的epoll。通过这种方式,可以释放侦听器线程,并且可以更快地接受连接。