Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【转】同步与异步&阻塞与非阻塞 #35

Open
GuoYongfeng opened this issue Jul 9, 2016 · 0 comments
Open

【转】同步与异步&阻塞与非阻塞 #35

GuoYongfeng opened this issue Jul 9, 2016 · 0 comments

Comments

@GuoYongfeng
Copy link
Member

同步与异步&阻塞与非阻塞

本文转载并整理自haoran_10

一、同步与异步的区别

1、概念介绍

  • 同步:所谓同步是一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,依赖的服务才能算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致。
  • 异步:所谓异步是一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。至于被依赖的服务最终是否真正完成,无法确定,所以它是不可靠的服务序列。

2、消息通知

  • 同步:当一个同步调用发出后,调用者要一直等待返回消息(或者调用结果)通知后,才能进行后续的执行;
  • 异步:当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。实际处理这个调用的部件在完成后,通过消息回调来通知调用者是否调用成功。

调用者获取依赖服务异步回调结果一般有两种方式,一种是主动去轮训查询异步回调的结果,一种调用依赖服务时传入一个callback方法或者回调地址,依赖服务完成之后去调用callback通知调用者。一般情况,这两种方式都要支持才是一种良好的异步回调设计方法。

3、场景比喻

小明去买奶茶,可能会有两种方式:

  • 小明点单交钱,然后等着取奶茶;
  • 小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取;

第一种方式就是同步,就等着奶茶妹做好奶茶,奶茶做好之后,小明拿到奶茶才算完成整个任务
第二种方式就是异步,奶茶妹给了小明一个小票,小明就算完成了。至于最后奶茶做好没有,反正奶茶妹会告诉小明的,那是后面的事情了。

4、总结

同步与异步着重点在消息通知的方式,也就是调用结果通知的方式。结合场景就是,拿到奶茶的方式。

二、阻塞与非阻塞的区别

1、概念介绍

  • 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。函数只有在得到结果之后才会返回。

Xml代码

阻塞调用和同步调用不同的。对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息。  
还有一点,在这里先扩展下:  
(a) 如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;  
(b) 如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;  
所以同步的实现方式会有两种:同步阻塞、同步非阻塞;同理,异步也会有两种实现:异步阻塞、异步非阻塞;  
对于阻塞调用来说,则当前线程就会被挂起等待当前函数返回;  
  • 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
    虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。

2、场景比喻

还是小明去买奶茶,可能会有两种方式

  • 小明点单交钱,然后等着取奶茶;
    • 小明在等着取奶茶的时候呢,啥都不干,就等着;小明等奶茶的行为就叫做阻塞,小明在等奶茶的时候,阻塞了!而这种方式又叫做同步阻塞。
    • 小明在等着取奶茶的时候呢,翻出手机,一会翻翻微信朋友圈,一会瞅瞅奶茶妹有没有做好奶茶;小明这种行为就叫做非阻塞,因为没有阻塞在等奶茶这件事情上。而这种方式又叫做同步非阻塞。
  • 小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取;
    • 奶茶妹给了小明一个小票,然后小明还是傻等着;小明这种拿到票还傻等着的行为,就叫阻塞。而这种行为,又叫做异步阻塞!这种最傻了。
    • 奶茶妹给了小明一个小票,然后小明翻出手机一直刷朋友圈,过了一会儿奶茶妹说小明你的奶茶好了,过来拿,小明才放下手机去拿奶茶。这种方式就叫做非阻塞,又叫着异步非阻塞!

3、总结

阻塞与非阻塞的着重点在于当前线程等待消息返回的行为。换成场景就是,小明等奶茶的行为。

三、大总结

  • 同步阻塞:小明啥都不干等奶茶。
  • 同步非阻塞:小明一边玩手机一边等奶茶。
  • 异步阻塞:小明拿着小票啥都不干等着奶茶妹告诉他奶茶好了
  • 异步非阻塞:小明拿着小票玩着手机等着奶茶妹告诉他奶茶好了
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant