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

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

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

阅读 2.6k
2 个回答

从概念上来讲,不管任何语言,在实现协程的时候都是一样的,否则就不叫协程了。所谓协程,就是指在运行这个协程的时候是非阻塞性的,非独占性的,在同一个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的协程被封装的太好了不需要关注调用关系问题

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题