请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于io多路复用的问题

老师,我有一个疑问。多路复用监听io流,对于epoll而言,有数据到达就会收到消息,然后去执行,如果此刻同时来了很多io流,epoll是不是也是一个一个顺序的去处理???如果是顺序处理,那么它和多线程并行处理比是不是比较慢?

正在回答 回答被采纳积分+3

1回答

Jeson 2019-04-07 20:21:59

微观上一定会有这样顺序执行,但epoll做到了io复用的最优处理。

通常来说epoll和多线程不会具备很大比较。

论项目的开发而言,epoll 、多线程 、 多进程 实际上也取决于具体的场景:

1. 一个连接一个线程模型:适用场景,连接少,且逻辑复杂。例如mysql采用此模型,一个连接一个线程。模型的一些小变体是线程采用线程池,避免创建销毁线程的开销

2. 半同步半异步模型:单独一个IO线程来异步处理网络IO,使用线程池来同步处理请求,业务逻辑的编写就会变得简单。适用于并发连接较多,但是每秒的请求量不太大的业务。可以参考
半同步半异步I/O的设计模式(half sync/half async)
也可以参考我的
handy/hsha.cc at master · yedf/handy · GitHub
Leader/Follower模式属于这个模型的变体

3. 全异步模型:网络IO和业务处理都是异步的,一个线程可以处理所有的任务,程序不会阻塞在任何一个网络IO或者磁盘IO上。这种模型能够最大程度利用计算机的性能,但是全异步的处理让业务的编写变得非常复杂。nginx这是这种模型,他是多进程,每个worker都是一样的,没有不同。memcache也是类似的,它的多线程完全是为了利用多个cpu能力,单线程也能够完整的跑整个业务的

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信