同步,异步,阻塞,非阻塞
tornado是个性能非常好的异步非阻塞框架(其本身也可以当做web服务器),其中这个异步非阻塞到底该怎么来理解呢。
网络编程中有同步和异步,阻塞和非阻塞这几种概念。搬照网上的一些解释:
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
异步的概念和同步相对,当一个异步过程调用发出后,调用者不会立刻得到结果,实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,通过回调函数处理这个调用。
阻塞调用是指调用结果返回之前,当前线程会被挂起,休眠
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
我自己的理解是。同步和异步针对的是在那些需要多部件合作完成任务中,如果调用者必须主动等待调用结果,则是同步,如果是被动等待调用结果,被调用者会通过某种方法来通知调用者,这种情况就是异步。非阻塞和阻塞主要是指调用者在等待结果期间的状态,如果线程休眠不能做别的事就是阻塞,如果调用立即返回,线程继续运行,那么就是非阻塞,这时要么调用者每隔段时间轮训(同步非阻塞),要么就要等被调用者主动通知(异步非阻塞)
举个栗子:
比如我去买书,书没有了,老板说需要去进货。我可以选择拿把椅子坐在书店门口睡觉,一直等到书到为止(同步阻塞)。或者我可以在这段时间做别的事,但是我每隔一段时间都要去书店问一下看看书到了没有(同步非阻塞)
以上两种方式都是同步的,因为我不知道什么时候书到,所以我需要自己去看,但是我可以选择睡觉干等,或者忙别的事再轮询。
如果老板和我说,不用等了,书到了直接就叫人送给我,这种情况下就是异步。我可以回家睡觉等人送书(异步阻塞),或者做别的任务(异步非阻塞)
再回到tornado,tornado可以通过长轮询实现服务器主动推送的效果,其实这个过程也是个异步非阻塞的调用。
首先用户请求页面,页面一加载的时候,就发送ajax请求到tornado服务器注册,留下个钩子(回调函数),服务器不回复,连接就一直保持着。因为ajax请求时,页面可以进行别的操作,所以是非阻塞(ajax特性),一旦服务器端数据发生变化,需要通知用户,就通过回调函数返回结果,然后ajax刷新页面,再次请求服务器,留下钩子……循环往复,这里就是通过回调函数实现的异步。
浙公网安备 33010602011771号