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

Posted thinksasa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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调用和要处理的内容地址交给内核,内核把所有任务处理完毕后将结果放到内容地址里,用户进程可以来该地址查看是否完成)

以上是关于libevent到底是同步还是异步,是阻塞还是非阻塞的主要内容,如果未能解决你的问题,请参考以下文章

Linux IO模型与Java NIO

同步异步,阻塞非阻塞,并发并行

Javascript 默认是同步(阻塞)还是异步(非阻塞)

转:聊聊同步异步阻塞与非阻塞

react中的setState到底是同步还是异步?

好好聊聊同步异步阻塞非阻塞