对于io复用的使用有一个套路,叫reactor模式。使用这种框架写代码和直接使用io复用函数相比,主要是把业务作为回调函数去注册,这样事件发生时调用回调函数,从而实现业务代码和基础设施代码分离。
libev就是一个将io复用做成reactor模式的框架
对于单线程的libev:就是把所有打开的fd都注册到一个loop. 当fd上有事件,libev就会自动调用回调函数,回调函数的执行也是在主线程里面的。如果回调函数计算量大,则比较费时,有可能影响libev监听其他fd的效率。
对于多线程的libev:一个线程一个loop,可以把不同的fd注册到不同的loop上。
比如做tcp server的时候,把socket()函数返回的fd注册到主线程的loop上,用主loop去监听事件。把accept()函数返回的fd注册到一个子线程的loop上,让子线程去处理这个fd的事件。并且可以把accept返回的1000个以内的fd分到同一个子loop。第10001个fd就再注册另外一个子线程的loop。以此类推。
做tcp client的时候,因为只有一个connect返回的fd,那么就没必要多个loop了。直接把这个fd注册到主线程的loop上就行。
对于定时器,可以把它注册到主线程的loop。也可以注册到单独一个线程的loop,这在主线程loop要处理的事件很多的情况下就有必要了,否则定时器就不能准时触发了。
http://code.taobao.org/p/ezlibs/src/opensrc/libev/offical/tutorial_libev/
http://c4fun.cn/blog/2014/03/06/libev-study/
http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod
libev多线程使用例
libev就是一个将io复用做成reactor模式的框架
对于单线程的libev:就是把所有打开的fd都注册到一个loop. 当fd上有事件,libev就会自动调用回调函数,回调函数的执行也是在主线程里面的。如果回调函数计算量大,则比较费时,有可能影响libev监听其他fd的效率。
对于多线程的libev:一个线程一个loop,可以把不同的fd注册到不同的loop上。
比如做tcp server的时候,把socket()函数返回的fd注册到主线程的loop上,用主loop去监听事件。把accept()函数返回的fd注册到一个子线程的loop上,让子线程去处理这个fd的事件。并且可以把accept返回的1000个以内的fd分到同一个子loop。第10001个fd就再注册另外一个子线程的loop。以此类推。
做tcp client的时候,因为只有一个connect返回的fd,那么就没必要多个loop了。直接把这个fd注册到主线程的loop上就行。
对于定时器,可以把它注册到主线程的loop。也可以注册到单独一个线程的loop,这在主线程loop要处理的事件很多的情况下就有必要了,否则定时器就不能准时触发了。
http://code.taobao.org/p/ezlibs/src/opensrc/libev/offical/tutorial_libev/
http://c4fun.cn/blog/2014/03/06/libev-study/
http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod
libev多线程使用例