同步异步、阻塞非阻塞
同步异步与阻塞非阻塞:
同步异步与阻塞非阻塞都是和IO相关的概念,阻塞非阻塞是与调用方相关的概念、而同步异步是被调用被相关的概念。同步异步说的是被调用者结果返回时通知进程的一种通知机制,阻塞非阻塞说的是调用结果返回前进程的状态,是挂起还是继续处理其他任务。
同步和异步:
同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
总结:同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。同步和异步是一种 消息通知机制, 是相对于被调用者而言的。
阻塞非阻塞:
阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。
非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。非阻塞看似简单,但是在调用时需要增加线程或者进程进行业务处理,这样线程间切换的效率问题需要被评估。
总结:阻塞和非阻塞最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。阻塞非阻塞 描述的是进程等待调用结果返回前的状态, 是相对于调用者而言的。
IO模型:
BIO (Blocking I/O):同步阻塞I/O模式,即调用方阻塞等待,被调用方直到处理完成同步返回。
NIO (Non-blocking I/O):主要指同步非阻塞I/O模式,即调用方非阻塞线程继续执行,被调用方同步处理并直接返回,主线程非阻塞执行,但是需要去不断地去轮询获取同步执行的状态,根据状态再做进一步的操作。
AIO (Asynchronous I/O):异步非阻塞I/O模型,即调用方线程不阻塞,继续执行,被调用方异步处理,处理完成之后以通知的方式或者callback的方式通知主线程。python的celery很容易实现异步非阻塞的任务,python 的 tornado 框架就是一种异步非阻塞框架。