请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

协程的调度好像最终也是基于线程池的,那么为什么协程就会优于线程呢?

看了网上的很多文章,基本都是说协程是可挂起的轻量级线程. 那到底协程本质是不是就是能比较高效地调度线程池. 总感觉协程的概念比较模糊,希望老师能解答一下.

正在回答 回答被采纳积分+3

1回答

bennyhuo 2019-06-29 06:41:10

咱们先来考虑下,线程比进程轻量,但线程是运行在进程上的,类似的,协程比线程轻量,协程运行在线程上。

再考虑,协程有自己的调用栈和运行状态,线程也有,但我用10000个协程协同的跑在几个线程上就可以维护10000个调用状态,这是线程池做不到的。再说的具体些,一个服务器,有请求进来,如果我们开线程处理请求,那么一个请求对应一个线程,10000个请求并发就得10000个线程,如果开协程,在非cpu密集型的业务下,其实根本不需要这么多线程的,开10000个协程提供服务,只需要几个线程就可以搞定,因为这10000个协程并不是都同时在运行,那些等待io的协程就可以挂起了。这块儿可以结合非阻塞io和io多路复用来考虑下~

0 回复 有任何疑惑可以回复我~
  • 提问者 慕姐9315664 #1
    这是否可以理解成协程对于线程的需求是可伸缩的,协程会根据任务的实际强度来调控线程. 比如10000个协程如果只是监听10000个请求的话,实际可能只需要极少数的线程, 但是如果这10000个协程同时在处理10000个并发的话,还是会启动大量的线程来处理.
    回复 有任何疑惑可以回复我~ 2019-06-29 11:08:03
  • bennyhuo 回复 提问者 慕姐9315664 #2
    所以注意是io密集型的程序,io密集型程序大量时间在处理io,处理io等待io事件的时候是不需要消耗cpu的,这时候对应的协程可以挂起,但如果是线程就只能阻塞了。如果是cpu密集型的,其实开线程也不能解决问题,得加cpu
    回复 有任何疑惑可以回复我~ 2019-06-29 11:50:21
  • 提问者 慕姐9315664 回复 bennyhuo #3
    谢谢老师的解答.现在对协程有了更加深刻的认识了. 我也刚看完协程这一章节,感觉协程比线程有很多的优势,似乎可以替代线程.那么老师觉得随着官方对协程框架的不断改进, 在将来的kotlin编程中,协程是否有取代线程的趋势?
    回复 有任何疑惑可以回复我~ 2019-06-30 00:29:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信