当前位置: 技术问答>linux和unix
关于IO多路复用使用?
来源: 互联网 发布时间:2017-05-24
本文导语: 在网上看到linux IO多路复用(如select、epoll)使用例子,都是采用在单线程中监听,然后处理。我有两个问题不明白: 1.大部分实现都是通过超时的方式,在同一个线程中处理accept和recv,能否在两个线程中分别处理a...
在网上看到linux IO多路复用(如select、epoll)使用例子,都是采用在单线程中监听,然后处理。我有两个问题不明白:
1.大部分实现都是通过超时的方式,在同一个线程中处理accept和recv,能否在两个线程中分别处理accept和select,且select一直阻塞?
2.如果客户端数量很多,采用单线程epoll_wait然后recv,感觉效率很低,能否根据机器cpu数量动态创建一定线程处理?如果能多线程处理,我考虑了2种方式,a.多个线程wait同一个epoll描述符,即每个线程执行相同线程函数(同一个事件会被多个线程捕捉吗?);b,每个线程创建一个epoll描述符,将客户端socket放在这些epoll中。这两种方式,那种是对的呢?又或者在处理大规模连接时,正确的处理方式是?
1.大部分实现都是通过超时的方式,在同一个线程中处理accept和recv,能否在两个线程中分别处理accept和select,且select一直阻塞?
2.如果客户端数量很多,采用单线程epoll_wait然后recv,感觉效率很低,能否根据机器cpu数量动态创建一定线程处理?如果能多线程处理,我考虑了2种方式,a.多个线程wait同一个epoll描述符,即每个线程执行相同线程函数(同一个事件会被多个线程捕捉吗?);b,每个线程创建一个epoll描述符,将客户端socket放在这些epoll中。这两种方式,那种是对的呢?又或者在处理大规模连接时,正确的处理方式是?
|
单线程处理 一般的网络连接量足以,一般只在数据进来后处理上耗时;
可以一个线程select,一个accept,但单单两个线程其实和 单线程工作是一样的的,accept要等select分发,而select后续的连接建立还是要等accpet处理,其实还是顺序执行;
一般是 一个主线程 select/poll/epoll, 分发到线程池 (或另起一线程),实现连接触发(select等)和accept(及后续数据处理)的并发
可以参考下libevent的事件处理
因为一个端口只能被一个进程listen,再大的话只能 做负载均衡,映射什么的~~
可以一个线程select,一个accept,但单单两个线程其实和 单线程工作是一样的的,accept要等select分发,而select后续的连接建立还是要等accpet处理,其实还是顺序执行;
一般是 一个主线程 select/poll/epoll, 分发到线程池 (或另起一线程),实现连接触发(select等)和accept(及后续数据处理)的并发
可以参考下libevent的事件处理
因为一个端口只能被一个进程listen,再大的话只能 做负载均衡,映射什么的~~