首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文读懂并发与并行,同步阻塞与异步阻塞

并发与并行

并发:指的是任务数多余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 上就有更好的性能。

以上部分观点引自知乎,侵删。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180627A08ACL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券