Goroutine(协程) VS 线程

举报
Jet Ding 发表于 2020/09/29 11:36:01 2020/09/29
2.8k+ 0 0
【摘要】 Goroutine是一个函数或方法,它可以独立执行,也可以与程序中的其他Goroutine同时执行。换句话说,在Go语言中,每一个同时执行的活动都被称为一个Goroutine。

1      Goroutine

Goroutine是一个函数或方法,它可以独立执行,也可以与程序中的其他Goroutine同时执行。换句话说,在Go语言中,每一个同时执行的活动都被称为一个Goroutine

2      线程

线程是操作系统的一部分,它负责执行一个应用程序。每一个在系统上执行的程序都是一个进程,为了运行应用程序里面的代码,一个进程使用了一个叫做线程的术语。线程是一个轻量级的进程,或者换句话说,线程是一个执行程序下代码的单元。所以每个程序都有逻辑,线程负责执行这个逻辑。

3      Goroutine和线程的一些区别

GOROUTINE

THREAD

Goroutines是由go运行时管理的。

操作系统线程由kernal管理。

Goroutine不依赖于硬件。

线程是依赖于硬件的。

Goroutine有简单的交流媒介,称为通道。

线程没有方便的交流媒介。

由于通道的存在,一个goroutine可以与其他goroutine进行低延迟的通信。

由于缺乏简单的通信媒介,线程间的通信存在了高延迟。

Goroutine没有ID,因为go没有线程本地存储。

线程有自己独特的ID,因为它们有线程本地存储。

Goroutines比线程代价低。

线程的代价比Goroutines高。

调度是协同式的。

调度是预先安排好的。

启动比线程快。

启动比Goroutines慢。

Goroutine有可生长的分段堆栈。

线程没有可生长的分段堆栈。

 

4      参考

http://tleyden.github.io/blog/2014/10/30/goroutines-vs-threads/#:~:text=You%20can%20run%20more%20goroutines,faster%20startup%20time%20than%20threads.&text=Goroutines%20are%20multiplexed%20onto%20a,than%20a%201%3A1%20mapping.

https://www.geeksforgeeks.org/golang-goroutine-vs-thread/

https://codeburst.io/why-goroutines-are-not-lightweight-threads-7c460c1f155f

https://rcoh.me/posts/why-you-can-have-a-million-go-routines-but-only-1000-java-threads/

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。