前言:
今天同学们对“http 同步 异步”大约比较重视,我们都需要剖析一些“http 同步 异步”的相关资讯。那么小编同时在网络上网罗了一些对于“http 同步 异步””的相关文章,希望小伙伴们能喜欢,兄弟们快快来了解一下吧!并发与并行
并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已),一个 CPU 执行多个任务.并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的。多个 CPU 执行多个任务(一个 CPU 负责一个任务)可以这样理解:
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
所以我认为它们最关键的点就是:是否是『同时』。
同步与异步阻塞
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
老张觉得自己聪明了。
所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。
所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。
python 中的同步与异步
当提到同步与异步,大家不免会想到另一组词语:阻塞与非阻塞。通常,同时提到这个这几个词语一般实在讨论 network io 的时候,在《unix network programming》中有详尽的解释,网络中也有许多讲解生动的文章。
本文所讨论的同步与异步,是指对于请求的发起者,是否需要等到请求的结果(同步),还是说请求完毕的时候以某种方式通知请求发起者(异步)。在这个语义环境下,阻塞与非阻塞,是指请求的受理者在处理某个请求的状态,如果在处理这个请求的时候不能做其它事情(请求处理时间不确定),那么称之为阻塞,否则为非阻塞。
举个例子,我去柜台办理业务,那我是请求者,柜员时受理者。如果我在柜台一直等着柜员办理,直到办理完毕,那么对于我来说,就是同步的;如果我只是在柜员那里登记,然后到一边歇着,等柜员办理完毕之后告诉我结果,那么就是异步的。对于柜员,办理业务的时候可能需要等待打印机打印,如果在这个时候柜员去处理其他人的业务,那么就是非阻塞的,如果一定得到把我的业务办完再接待下一位顾客,那么就是阻塞的。
本文站在请求发起者的角度来思考同步与异步,在实际开发中,一个最简单的例子就是 http 请求。假设这么一个场景,程序需要访问两个网址(通过 url),如果只有一个线程。那么同步与异步分别怎么处理呢
python 的 urllib 是同步的,即当一个请求结束之后才能发起下一个请求,我们知道 http 请求基于 tcp,tcp 又需要三次握手建立连接(https 的握手会更加复杂),在这个过程中,程序很多时候都在等待IO,CPU 空闲,但是又不能做其他事情。但同步模式的优点是比较直观,符合人类的思维习惯: 那就是一件一件的来,干完一件事再开始下一件事。在同步模式下,要想发挥多核 CPU 的威力,可以使用多进程或者多线程(注意 python 的多线程并不能发挥多核,严格意义上是单线程)。
如果发出了请求就立即返回,这个时候程序可以做其他事情,等请求完成了时候通过某种方式告知结果,然后请求者再继续再来处理请求结果,那么我们称之为异步,最常见的就是回调(callback),在 python 中,tornado 提供了异步的 http 请求。
异步的优势所在:不用在 IO 上等待,在单核 CPU 上就有更好的性能。
以上部分观点引自知乎,侵删。
标签: #http 同步 异步