美文网首页
golang中线程和协程的区别

golang中线程和协程的区别

作者: 也许会了 | 来源:发表于2021-04-22 17:27 被阅读0次

协程

协程,英文名Coroutine。但在 Go 语言中,协程的英文名是:gorutine。它常常被用于进行多任务,即并发作业。没错,就是多线程作业的那个作业。

虽然在 Go 中,我们不用直接编写线程之类的代码来进行并发,但是 Go 的协程却依赖于线程来进行。

下面我们来看看它们的区别。

线程的基础介绍,这里请自行网上搜索文章,因为关于线程的优秀介绍文章已经很多。

协程的特点

这里先直接列出线程的特点,然后从例子中进行解析。

多个协程可由一个或多个线程管理,协程的调度发生在其所在的线程中。

可以被调度,调度策略由应用层代码定义,即可被高度自定义实现。

执行效率高。

占用内存少。

上面第 1和第 2点

我们来看一个例子:

func TestGorutine(t *testing.T) {

runtime.GOMAXPROCS(1)  // 指定最大 P 为 1,从而管理协程最多的线程为 1 个

wg := sync.WaitGroup{} // 控制等待所有协程都执行完再退出程序

wg.Add(2)

// 运行一个协程

go func() {

fmt.Println(1)

fmt.Println(2)

fmt.Println(3)

wg.Done()

}()

// 运行第二个协程

go func() {

fmt.Println(65)

fmt.Println(66)

// 设置个睡眠,让该协程执行超时而被挂起,引起超时调度

time.Sleep(time.Second)

fmt.Println(67)

wg.Done()

}()

wg.Wait()}

上面的代码片段跑了两个协程,运行后,观察输出的顺序是交错的。可能是:

656612367

意味着在执行协程A的过程中,可以随时中断,去执协程行B,协程B也可能在执行过程中中断再去执行协程A。

看起来协程A 和 协程B 的运行像是线程的切换,但是请注意,这里的 A 和 B都运行在同一个线程里面。它们的调度不是线程的切换,而是纯应用态的协程调度。

关于上述代码中,为什么要指定下面两行代码?

runtime.GOMAXPROCS(1)time.Sleep(time.Second)

这需要您去看下 Go 的协程调度入门基础,请看我之前的另外一篇调度分析文章:

Go 的协程调度机制

如果不设置 runtime.GOMAXPROCS(1),那么程序将会根据操作系统的 CPU 核数而启动对应数量的 P,导致多个 M,即线程的启动。那么我们程序中的协程,就会被分配到不同的线程里面去了。为了演示,故设置数量 1,使得它们都被分配到了同一个线程里面,存于线程的协程队列里面,等待被执行或调度。

协程特点中的第 3和第 4点。

3. 执行效率高。

4. 占用内存少。

因为协程的调度切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。调度发生在应用态而非内核态。

内存的花销,使用其所在的线程的内存,意味着线程的内存可以供多个协程使用。

其次协程的调度不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,所以执行效率比多线程高很多。

协程和线程的整体对比

比较的点线程协程

数据存储内核态的内存空间一般是线程提供的用户态内存空间

切换操作操作最终在内核层完成,应用层需要调用内核层提供的 syscall 底层函数应用层使用代码进行简单的现场保存和恢复即可

任务调度由内核实现,抢占方式,依赖各种锁由用户态的实现的具体调度器进行。例如 go 协程的调度器

语音支持程度绝大部分编程语言部分语言:Lua,Go,Python …

实现规范按照现代操作系统规范实现无统一规范。在应用层由开发者实现,高度自定义,比如只支持单线程的线程。不同的调度策略,等等

本文来自php中文网的golang栏目:https://www.php.cn/be/go/

相关文章

  • Go语言学习笔记七(并发编程)

    协程机制 Golang 线程和协程的区别 备注:需要区分进程、线程(内核级线程)、协程(用户级线程)三个概念。 进...

  • golang中线程和协程的区别

    协程 协程,英文名Coroutine。但在 Go 语言中,协程的英文名是:gorutine。它常常被用于进行多任务...

  • 不同语言的协程示例

    进程和线程、协程的区别async 函数的含义和用法上面两篇文章介绍进程,线程, 和协程,以及javascript中...

  • 说一说协程

    首先,我们了解一下进程,线程和协程三个概念之间的区别 进程,线程,协程区别 进程 拥有自己独立的堆和栈,既不共享堆...

  • Python多线程、多进程和协程的实例讲解

    线程、进程和协程是什么 线程、进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实...

  • 进程,线程和协程的区别

    一、进程 操作系统中最核心的概念是进程,分布式系统中最重要的问题是进程间通信。 进程是“程序执行的一个实例” ,担...

  • 进程、线程和协程的理解

    进程、线程和协程的理解 进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。 进程拥有自己独...

  • python - 多线程和协程速率测试对比

    多线程和协程都属于IO密集型,我通过以下用例测试多线程和协程的实际速率对比。 实例:通过socket客户端以多线程...

  • 面试突击

    请你说说线程和协程的区别 得分点 地址空间、开销、并发性、内存 标准回答 进程和线程的主要差别在于它们是不同的操作...

  • golang中协程和线程的区别

    一般来说,协程就像轻量级的线程。 线程一般有固定的栈,有一个固定的大小。而goroutines为了避免资源浪费(亦...

网友评论

      本文标题:golang中线程和协程的区别

      本文链接:https://www.haomeiwen.com/subject/oijfrltx.html