Go语言基础——协程| 青训营

61 阅读2分钟

Go 原生支持应用之间的通信和程序的并发。程序可以在不同的处理器和计算机上同时执行不同的代码段。Go 语言为构建并发程序的基本代码块是 协程 (goroutine) 与通道 (channel)。

协程

一个应用程序是运行在机器上的一个进程;进程是一个运行在自己内存地址空间里的独立执行体。一个进程由一个或多个操作系统线程组成,这些线程其实是共享同一个内存地址空间的一起工作的执行体。几乎所有’正式’的程序都是多线程的。

协程指在后台中运行的轻量级执行线程,Go协程是 Go 中实现并发的关键组成部分。

协程与线程区别

  1. 线程一般有固定的栈,有一个固定的大小。而goroutines为了避免资源浪费(亦或是资源缺乏),采用动态扩张收缩的策略:初始量为2k,最大可以扩张到1G。
  1. 每个线程都有一个id,在线程创建的时候就会被返回,所以我们可以通过线程的id来操纵线程。但是在golang中没有这个概念,因此我们在编码之初就要考虑协程的创建和释放问题
  1. 在切换开销方面,goroutine 远比线程小

启动协程

用go关键字

go 函数名(参数)

Go协程和主协程

一般主协程里的语句执行速度快于其他goroutine,而当主协程执行完毕后,程序就会终止,于是其他goroutine也不会继续运行。

 并发和并行的差异

Go 的并发原语提供了良好的并发设计基础:表达程序结构以便表示独立地执行的动作;所以 Go 的重点不在于并行的首要位置:并发程序可能是并行的,也可能不是。并行是一种通过使用多处理器以提高速度的能力。但往往是,一个设计良好的并发程序在并行方面的表现也非常出色。

Go 协程(goroutines)和协程(coroutines)

  • Go 协程意味着并发(或者可以以并行的方式部署),协程一般来说不是这样的
  • Go 协程通过通道来通信;协程通过让出和恢复操作来通信
  • Go 协程比协程更强大,也很容易从协程的逻辑复用到 Go 协程。