libevent到底是同步还是异步,是阻塞还是非阻塞

        应该从不同角度看libevent的同步/异步、阻塞/非阻塞:
  1. IO数量的角度:select出来之前,会阻塞在一个io上,处理完成后再阻塞在下一个io上;之后就是把所有的io fd拿过来,都不阻塞,一个一个fd去询问是否可读,每次询问完后把可读的io fds返回;所以说:libevent是非阻塞的;
  2. libevent运行在不同的线程上:select本质上是一个while询问,难道while不是阻塞吗?所以说调用event_base_dispatch()的线程是阻塞的;所以这样说:libevent是阻塞的;
  3. IO操作流:尽管select能监听一群IO的fds,但某个IO的fd不是也得等待事件通知来了后才会回调callback吗? 所以说:libevent是同步的。
总结:libevent是同步的,但不能说是阻塞或者非阻塞。这也是为什么官方介绍上没有同步/异步,阻塞/非阻塞字样介绍libevent。
 
         同时,有两个问题值得思考下:
         1. 既然select/poll/epoll能够实现监听多个fd,那为什么在监听socket的时候需要设置为非阻塞呢? (见UNP)
         2. 异步IO是怎么实现的? (见linux的AIO,将IO调用和要处理的内容地址交给内核,内核把所有任务处理完毕后将结果放到内容地址里,用户进程可以来该地址查看是否完成)
posted @ 2020-05-16 11:39  洒洒  阅读(1766)  评论(0编辑  收藏  举报