Python 的协程和 golang 的协程有什么区别?

Python 的协程和 golang 的协程有什么区别?

会点 Python 的协程,最近在学习 golang

协程又是 golang 的招牌,想知道 golang 的协程和 Python 的协程有什么区别?


回答:

从概念上来讲,不管任何语言,在实现协程的时候都是一样的,否则就不叫协程了。所谓协程,就是指在运行这个协程的时候是非阻塞性的,非独占性的,在同一个CPU上它也依然会将时间片划出来给其它协程使用。那么唯一的区别就是写法上的不同,比如Go语言里最简单的协程:

package main

import (

"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 asyncio

async 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:

  1. 所有的async的函数进行task 事件监听
  2. python协程需要进行await 来挂起显式的交出控制权,被await的函数也会进行task
  3. 协程函数里面调用同步代码会阻塞当前操作io

go:
go关键字函数直接进入task,控制权直接被交出了但是携程里面的程序却还在执行,明面很像python里面进程,具体里面的细节我也不太懂,go的协程被封装的太好了不需要关注调用关系问题

总之协程在很多语言都有,特性都差不多,不然为什么叫协程呢

以上是 Python 的协程和 golang 的协程有什么区别? 的全部内容, 来源链接: utcz.com/p/938376.html

回到顶部