以前对协程的概念是很模糊的,搞不清协程到底是什么,有人说goroutine
才是协程,yield
不是协程,为了搞清楚疑惑,我总结了几点
1 、可以主动让出
,和被动恢复
,这里不针对具体语言的实现
2 、让出和恢复不需要 CPU 调度,由用户(写代码的人)根据逻辑完成
3 、协程在语言的实现有不同,Go 的 goroutine ,JavaScript 的 Promise ,Rust 的 Future ,PHP 的 yield 、都是协程的实现
如 Java 使用的 nio 有非常好的性能,单线程的 JavaScript 异步 io 也很出色,可为什么到了协程这块我就会陷入一个误区那就是协程肯定比异步快,因为 Go 语言所以接触到了协程,感觉协程就是 Go 语言的(先入为主的概念),其它语言就是没有(或者不是 Go 那样开启协程也不是协程,如 yield )
先回顾一下异步是什么样的,函数立即执行,有结果后执行回调函数,业务复杂也就会有回调地狱的问题
io 可以分为两个阶段,io 发起(10ms),io 完成(300ms),异步不就是这样吗,io 发起后立即返回,剩下的时间可以去执行其它代码
那协程又是什么样的,记住最重要的一点,协程是可以主动让出的,被动恢复,可以想象一下,当 io 发起后,我让出执行权,io 完成时恢复执行,这是不是就解决了回调地狱的问题呢?
所以协程是解决回调地狱的问题,编写同步代码,异步执行!
单线程下,同一时刻只有一个协程在运行(之前老和并行搞混)
协程用于 io 密集场景,也就是利用等 io 的这段时间去执行其它的代码,异步不也是这样吗?协程和异步是互补的关系
像 php 的 yield 、JavaScript 的 Promise 、Rust 的 Future 都是协程的本质实现
goroutine 要单独拿出来说,它远远超出了协程的本质,它有一个强大的调度器
欢迎交流讨论,提成不同的看法~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.