同步:编程
我调用一个功能,该功能没有结束前,我死等结果。promise
异步:异步
当一个异步过程调用发出后,调用者不能马上获得结果。该功能在完成后,经过状态、通知和回调来通知调用者。socket
同步和非同步关注的是调用者是否等待等待调用结果。分布式
举个通俗的例子:
你打电话问书店老板有没有《分布式系统》这本书,若是是同步通讯机制,书店老板会说,你稍等,”我查一下",而后开始查啊查,等查好了(多是5秒,也多是一天)告诉你结果(返回结果)。
而异步通讯机制,书店老板直接告诉你我查一下啊,查好了打电话给你,而后直接挂电话了(不返回结果)。而后查好了,他会主动打电话给你。在这里老板经过“回电”这种方式来回调。异步编程
阻塞:函数
调用我(函数),我(函数)没有接收完数据或者没有获得结果以前,我不会返回。this
非阻塞:spa
调用我(函数),我(函数)当即返回通知调用者线程
以最经常使用的send和recv两个函数为例
好比你调用send函数发送必定的Byte,在系统内部send作的工做其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不表明数据已经成功的发送出去了,若是TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不一样之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去之后才返回,而对于非阻塞的socket来讲send会当即返回WSAEWOULDDBLOCK告诉调用者说:"发送操做被阻塞了!!!你想办法处理吧..."
对于recv函数,一样道理,对于阻塞模式的socket来讲若是TCP/IP协议栈的接收缓冲区没有通知一个结果给它它就一直不返回:耗费着系统资源....对于非阻塞模式的socket该函数会立刻返回,而后告诉你:WSAEWOULDDBLOCK---"如今没有数据,回头再来看看"
阻塞I/O模型:
非阻塞I/O模型:
阻塞和非阻塞关注的是调用者在等待调用结果时的状态。
仍是上面的例子,
你打电话问书店老板有没有《分布式系统》这本书,你若是是阻塞式调用,你会一直把本身“挂起”,直到获得这本书有没有的结果,若是是非阻塞式调用,你无论老板有没有告诉你,你本身先一边去玩了, 固然你也要偶尔过几分钟check一下老板有没有返回结果。
同步异步与阻塞非阻塞的关系:
异步调用的方式:
function lightUp(A, callback){ callback(); A.lightUp(); } function callback(){ B.lightUp(); }
var temp = false; while(!temp){ temp = wait(A.lightUp()); } B.lightUp();
function AlightUp(){ this.trigger('done'); this.do(); } function BlightUp(){ this.do(); }
AlightUp.on('done',BlightUp);
jQuery.subscribe("done", f2); function f1(){ setTimeout(function () { // f1的任务代码 jQuery.publish("done"); }, 1000); }
jQuery.unsubscribe("done", f2);
f1().then(f2); function f1(){ var dfd = $.Deferred(); setTimeout(function () { // f1的任务代码 dfd.resolve(); }, 500); return dfd.promise; }