c++ - 使用 epoll 处理多个并发请求

标签 c++ linux server epoll

我正在尝试学习如何使用 epoll 来创建一个服务器,该服务器接收并执行来自客户端的命令(登录、下载文件等)。到目前为止,我已经让程序简单地向客户端发送它收到的所有数据,但我注意到当我尝试执行我列出的命令时,服务器一次只能处理一个请求。

我正在尝试想出一种可以同时处理许多命令的有效方法。到目前为止,我想到的唯一想法是创建一个单独的线程来处理每个请求,但我不确定这是否是最佳解决方案。处理此问题的好方法是什么?

最佳答案

如果你的架构是 epoll + 单线程,那么如果你的命令负载很重,它就会有一些阻塞问题。这就是为什么当某些命令被阻塞时,redis 的性能会下降。

还有其他可能的架构。但在尝试这些之前,请先进行一些性能测试。如果 Redis 可以在单线程内完成数百万次 OPS,你也可以做到。

epoll + command per thread:正如你所说。但是线程的创建和销毁会在负载上升时增加成本。频繁的上下文切换也是一个大问题。

epoll + 线程池:示例思路。但没有上述缺点。

epoll based listener + N*(epoll worker):这是一个有趣的结构。 epoll 监听器将从用户那里获取请求,但它不是直接将作业分配给线程,而是将文件描述符注册到下一个 worker 的 epoll 中。这样,监听器线程就被释放了,可以更快地接受连接。

关于c++ - 使用 epoll 处理多个并发请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27936559/

相关文章:

c++ - 将 float 转换为 int 时的奇怪行为

c++ - 返回完整或空 std::optional 时的 If-then-else 与三元运算符

linux - Linux 中 MEX 文件的独立程序

linux - 在linux中复制具有目录结构的修改后的文件

php - 当 php.ini 或 .user.ini 文件加载到服务器上时?

docker - Nginx不以docker-compose run命令开头

python - 如何从 python (py) 文件中调用 C++ 函数?

c++ - 如何在opencv中为图像添加边框,边框颜色必须与图像颜色相同

linux - 如何将 libacl 用于 udev?

python - 当客户端没有在Python中写任何内容(我只按Enter)时,如何从服务器验证变量