查看: 1854| 回复: 6
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] <同步,异步>与<阻塞,非阻塞>的区别?

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
去年面试的时候被问到了一个问题:你觉得<同步,异步>与<阻塞,非阻塞>两组概念之间有什么区别?

当时我答得比较烂,大概就是举了些例子,比如线(进)程的同步,以及系统调用的阻塞非阻塞。它们之间真正的区别从来没有完全梳理清楚过。哪位能够给一个比较清晰的解释?

上一篇:有限内存和二叉树操作
下一篇:学习算法的一本免费电子书《初等算法》国人写的
推荐
白羽幸 2019-8-18 09:03:17 | 只看该作者
全局:
阻塞: 你去餐厅的时候得在门口排队等
非阻塞:你去餐厅领个号,然后想干嘛去干嘛,排到了餐厅打电话通知你

同步:你工作的时候专心工作,工作做完了再做其他事
异步:你喜欢一边工作一边划水(上网,看电影,玩游戏etc.)

阻塞非阻塞一般是实现层面的东西,同步异步更多是编程风格的事情。就比如去餐厅吃饭的时候你得在门口等,但是同时你可以在餐厅门口干其他事情,对应的就是你call一个api会一直阻塞住,但是你call一个阻塞的api之前可以开一个线程干其他的;你去餐厅领号了之后你也可以不干其他事情就在门口那死等,对应的就是call一个非阻塞的api之后啥也不干就在那等它通知你。

评分

参与人数 4大米 +7 收起 理由
niko.xw + 1 很有用的信息!
丑猪宝 + 1 给你点个赞!
14417335 + 3
真金属骑士 + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
helloteacha 2019-8-18 07:54:14 | 只看该作者
全局:
本帖最后由 zorrowei 于 2019-8-18 07:56 编辑

最近写TCP socket的程序,有个例子好帮助理解阻塞与非阻塞。我有个应用程序通过socket读取网络某处的video 数据源(e.g.,web cam). 如果应用程序是阻塞方式(blocking)socket read the webcam stream,一旦webCam因为某种原因暂停发送stream了,那么整个应用程序就处于一直阻塞等待模式,就好像整个应用程序的process都freeze了。我理解,就socket的阻塞与非阻塞应该是在process之间。同步、异步是不是大部分的case是在线程间?如果我的理解和表述有问题,往大家指出来并给建议!
回复

使用道具 举报

🔗
eagleoflqj 2019-8-18 22:43:24 | 只看该作者
全局:
同步:A做完才能做B
异步:A做不完B也可以先开始
阻塞:一个步骤需要等待完成
非阻塞:一个步骤立即完成
所以一组是两件事的先后关系,另一组是一件事的性质。
可以看出同步异步、阻塞非阻塞的4种组合中,只有异步阻塞是矛盾的。
其他三种呢?一个实际的例子是,如果几个进程都想写同一个文件,那么只有持有锁的进程才可以写。
同步阻塞:
getlock()
write()
getlock函数若未获取到锁则等待(此时可以调度其他进程上CPU执行),当它返回时当前进程必获取到锁。
同步非阻塞:
while try_getlock() is False
    pass
write()
try_getlock的执行只是试图获取锁,就看当前时刻有没有别的进程持有锁,若成功则立即返回True,若锁被其他程序占有则立即返回False。注意这里获取锁和写文件仍是同步的,只是这个进程并未被阻塞,它一直在运行,一次次地尝试获取锁并浪费宝贵的CPU时间,这种忙等待不可取。
但如果你的函数库没有getlock,只有try_getlock怎么办?一种可能的改进是,将pass换成time.sleep(一小段时间)。
异步非阻塞:
getlock_async(callback=write)
do_something_else()
这里跟前面稍微有些区别,定义中的A和B不再是获取锁和写文件,而是获取锁和其他事情。虽然获取不到锁仍然不能写文件,但我至少在等待获取锁的时间里,还可以(在当前进程中)做一些其他事情(因为同步阻塞也不会浪费CPU,只是当前进程的其他工作不能进行了)。
至于其他事情做的过程中锁拿到了怎么办,这就要看解释器的处理了。在浏览器javascript中,是其他事情做完后,才去写文件(当然浏览器js没有写文件的功能,只是比方)。在python3的(假)多线程中,不用等其他事情做完就可以写文件。
回复

使用道具 举报

🔗
Airtnp 2019-8-18 23:01:02 | 只看该作者
全局:
感觉 https://www.zhihu.com/question/19732473 说的和上面恰好反过来
所以我决定放弃理解这个问题, 同步异步就是Result还是Future<Result>, 阻塞非阻塞就是F.get()还是F.try_get()
回复

使用道具 举报

🔗
寻找村子 2019-8-19 01:21:29 | 只看该作者
全局:
白羽幸 发表于 2019-8-18 09:03
阻塞: 你去餐厅的时候得在门口排队等
非阻塞:你去餐厅领个号,然后想干嘛去干嘛,排到了餐厅打电话通知你 ...

这里面的“你”,是指“CPU”?谢谢
回复

使用道具 举报

🔗
白羽幸 2019-8-19 03:43:47 | 只看该作者
全局:
寻找村子 发表于 2019-8-19 01:21
这里面的“你”,是指“CPU”?谢谢

你可以这么理解,但是我的原意是指写下那段代码的你,因为cpu执行的代码是你写的。事实上,你在写代码的时候可以自由选择用同步还是异步,但是你调用的api可能只提供阻塞或者非阻塞其中之一。正如餐厅可能不提供打电话叫号服务,但是你可以选择在餐厅门口排队等号的时候干其他事情

当你是写api的人的时候,你可以选择是提供阻塞还是非阻塞,这个时候你就成了餐厅老板了。至于你的客户是用同步还是异步,就不是你管得着的了

评分

参与人数 1大米 +3 收起 理由
helloteacha + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表