一亩三分地

 找回密码 注册账号

扫描二维码登录本站


Salarytics=Salary Analytics
查询工资数据
系统自动计算每年收入

码农求职神器Triplebyte
不用海投
内推多家公司面试

科技公司如何
用数据分析驱动产品开发
coupon code 250off 立减$250

深入浅出AB Test
从入门到精通
coupon code 250off 立减$250
游戏初创公司招聘工程师、UIUX Designer和游戏策划
坐标湾区
DreamCraft创始团队
招聘游戏开发工程师
查看: 613|回复: 6
收起左侧

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

[复制链接] |试试Instant~
我的人缘0

分享帖子到朋友圈
liux0656 | 显示全部楼层 |阅读模式
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   99% (467)
 
 
0% (4)    👎

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

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

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

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

评分

参与人数 1大米 +3 收起 理由
14417335 + 3

查看全部评分


上一篇:有限内存和二叉树操作
下一篇:学习算法的一本免费电子书《初等算法》国人写的
我的人缘0
白羽幸 2019-8-18 09:03:17 | 显示全部楼层
本楼: 👍   100% (5)
 
 
0% (0)   👎
全局: 👍   91% (1050)
 
 
8% (94)    👎
阻塞: 你去餐厅的时候得在门口排队等
非阻塞:你去餐厅领个号,然后想干嘛去干嘛,排到了餐厅打电话通知你

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

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

评分

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

查看全部评分

回复

使用道具 举报

我的人缘0
zorrowei 2019-8-18 07:54:14 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   97% (94)
 
 
2% (2)    👎
本帖最后由 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是在线程间?如果我的理解和表述有问题,往大家指出来并给建议!

评分

参与人数 1大米 +3 收起 理由
14417335 + 3

查看全部评分

回复

使用道具 举报

我的人缘0
eagleoflqj 2019-8-18 22:43:24 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (14)
 
 
0% (0)    👎
同步: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的(假)多线程中,不用等其他事情做完就可以写文件。
回复

使用道具 举报

我的人缘0
Airtnp 2019-8-18 23:01:02 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   94% (148)
 
 
5% (9)    👎
感觉 https://www.zhihu.com/question/19732473 说的和上面恰好反过来
所以我决定放弃理解这个问题, 同步异步就是Result还是Future<Result>, 阻塞非阻塞就是F.get()还是F.try_get()
回复

使用道具 举报

我的人缘0
寻找村子 2019-8-19 01:21:29 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (8)
 
 
0% (0)    👎
白羽幸 发表于 2019-8-18 09:03
阻塞: 你去餐厅的时候得在门口排队等
非阻塞:你去餐厅领个号,然后想干嘛去干嘛,排到了餐厅打电话通知你 ...

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

使用道具 举报

我的人缘0
白羽幸 2019-8-19 03:43:47 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   91% (1050)
 
 
8% (94)    👎
寻找村子 发表于 2019-8-19 01:21
这里面的“你”,是指“CPU”?谢谢

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

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

评分

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

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法 - 不要多加空格: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版||一亩三分地

GMT+8, 2019-9-23 00:03

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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