epoll

我们知道tornado通过非阻塞的方式以及对epoll的运用,才使得性能上得到了很大的提升。那么epoll到底是什么,它在tornado中扮演着怎样的角色呢?

1.epoll解读

说到epoll,就得先说说阻塞和非阻塞,这里大家自行百度或者脑补。
我们通常处理数据流可能是这样的

  1. While true
  2. for i in stream:
  3. if i has data:
  4. Do something with i

这种方式显然很差劲,他会一直轮询,不管数据流中是否有IO事件。针对这种情况就出现了select,
它可以甄别数据流是否有IO,当无IO的时候,就阻塞在那里,直到下一次IO发生,在进行操作。

  1. While true
  2. selectstream
  3. for i in stream
  4. if i has data
  5. Do something

虽然我们不用白白的轮询,也知道了是否发生IO,,但却并不知道是那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。
因此epoll就诞生了,epoll全称就是event poll,和咱们平常用的轮询不同,基于事件的epoll会把哪个数据流发生了怎样的事件告诉我们。

  1. while true
  2. active_stream[] = epoll_wait(epollfd)
  3. for i in active_stream[]:
  4. read or write till unavailable