Python 的协程和 golang 的协程有什么区别?
会点 Python
的协程,最近在学习 golang
。
协程又是 golang
的招牌,想知道 golang
的协程和 Python
的协程有什么区别?
回答:
从概念上来讲,不管任何语言,在实现协程的时候都是一样的,否则就不叫协程了。所谓协程,就是指在运行这个协程的时候是非阻塞性的,非独占性的,在同一个CPU上它也依然会将时间片划出来给其它协程使用。那么唯一的区别就是写法上的不同,比如Go语言里最简单的协程:
package mainimport (
"time"
"fmt"
)
func say(s string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("hello world")
time.Sleep(1000 * time.Millisecond)
fmt.Println("over!")
}
在python里写起来可能就是这样:
import asyncioasync def say(s):
for _ in range(3):
await asyncio.sleep(0.1)
print(s)
async def over():
await asyncio.sleep(1)
print('over!')
async def main():
await asyncio.gather(
say('hello world'),
over()
)
asyncio.run(main())
区别在于Go语言的协程是语言级别的,也就是说你不用安装任何库就可以使用go
来启动一个协程,而Python的协程你需要先引入一下asyncio
这个库然后才能使用。不过我觉得这个问题并不关键,无非就是把协程这个概念是包在了语言当中还是放在了库里而已,并不值得Go粉们大吹特吹。那我是不是还可以说Python也内置了很多函数,不像Java还需要显式声明很多包呢?
所以我们学语言学的只是一种表达方式,不同的语言有不同的表达方式,但最重要的其实是概念本身,就像不管你是中文还是英文,语法并不重要,重要的是语法所传达的思想。
回答:
本质上都是有一个线程进行task循环监听状态里面每个携程函数
这是go 说明 https://github.com/LeoYang90/...
python的async在知乎有一篇很深邃的解释
这个视频也很通透适合入门 https://www.bilibili.com/vide...
我个人
感觉go里面的go关键字协程更像python的进程表现
python:
- 所有的async的函数进行task 事件监听
- python协程需要进行await 来挂起显式的交出控制权,被await的函数也会进行task
- 协程函数里面调用同步代码会阻塞当前操作io
go:
go关键字函数直接进入task,控制权直接被交出了但是携程里面的程序却还在执行,明面很像python里面进程,具体里面的细节我也不太懂,go的协程被封装的太好了不需要关注调用关系问题
总之协程在很多语言都有,特性都差不多,不然为什么叫协程呢
以上是 Python 的协程和 golang 的协程有什么区别? 的全部内容, 来源链接: utcz.com/p/938376.html