同步网络、异步网络

一直对同步网络和异步网络很模糊,百度了一下,转载几个好的解释,加强记忆。

关于同步异步是什么

一个百度问答的解释,https://zhidao.baidu.com/question/544230590.html

网络编程中,同步的意思是说,进行收发数据,等到数据真正发送出去或者接受到,才返回;而异步的意思是,可以把数据发送到缓冲区立即返回,而发送成功的消息是通过事件通知的。异步可以腾出更多的CPU来处理其他事情,所以异步的方式比较灵活。 线程同步是指,多个线程协同完成一件工作,一个线程需要等待其他线程完成相关的工作,才能接着往下运行。线程同步一般采用互斥体,信号量,消息等方式。


一个知乎用户的解释 https://zhuanlan.zhihu.com/p/21416728

网络IO模型大概有这么几种:阻塞IO,非阻塞IO,多路IO复用IO,异步IO。网络上经常听到这种所谓2×2的说法,即存在同步阻塞、同步非阻塞、异步阻塞和异步非阻塞这四种IO组合。

阻塞、非阻塞、多路IO复用,都是同步IO,真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

我的理解是,IO操作从数据准备到数据拷贝直到最后数据操作完成,这一过程全都在用户线程的直接参与中完成的,就是同步IO。相反的,用户线程发起了IO操作,但并不从这一操作中得到返回值或者等待整个操作完成,而是把这个任务全权交给CPU来完成,并最后从CPU得到一个完成信号,这样做的是异步IO


总结:同步异步被很多场景使用:IO、线程、网络等( 其它领域的就不提了)。

但IO的同步是指调用者和被调用者的同步;线程的同步是指调用者(各线程)之间的同步(一位大牛的话,很有道理)。其实网络的同步也是指调用者和被调用者的同步。


线程的同步你可以理解成对数据的同步,多个线程必须排队按顺序(串行化)读写数据,这就是线程同步,目的是为了避免不可预知的逻辑错误,也就是“线程安全”。

IO同步可以在单线程场景下理解:线程读写IO,如果必须阻塞等待IO返回才能继续执行,就是同步的,否者就是异步的。

关于异步网络的优势

优势很明显:异步网络是把请求提交给服务端后就可以去干其它的事情了,等服务端处理完后再来通过客户端;

同步就不能了,(阻塞)得一直守着其它的都不能,(非阻塞)一过等一边干其它的。那么这样在WEB体检中比如一个任务中需要很久可是我们不用一直等那个进度条了。这样用户的体验会更好。对于IO来说服务器来说,我们的线程不用等待IO的完成就可以继续干其它的活,那么服务器会减少IO特别繁忙而CPU很空闲的情况了。

经常用异步和同步的地方

用到异步的地方,除了上面说到的IO、线程、网络,从其它角度来说,还有JS中的AJAX的请求,文件上传下载,数据库读写数据等等。

异步网络的框架

现在Python的WEB开发也有很多异步框架,比如Tornado,Twisted。还有一些网络库Gevent也很优秀。

0

热门评论