Golang Goroutine的使用方法有哪些

  介绍

这篇文章将为大家详细讲解有关Golang Goroutine的使用方法有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。


Goroutine是去并行设计的核心.goroutine说到底其实就是协程,它比线程更小,十几个Goroutine可能体现在底层就是五六个线程,去语言内部帮你实现了这些Goroutine之间的内存共享。

执行Goroutine只需极少的栈内存(大概是4 ~ 5 kb),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务.goroutine比线程更易用,更高效、更轻便。

一般情况下,一个普通计算机跑几十个线程就有点负载过大了,但是同样的机器却可以轻松地让成百上千个Goroutine进行资源竞争。


只需在函数调,# 12132;语句前添加去关键字,就可创建并发执,# 12175;单元。

开发,# 12040;员无需了解任何执,# 12175;细节,调度器会自动将其安排到合适的系统线程上执行。

在并发编程中,我们通常想将一个过程切分成几块,然后让每个Goroutine各自负责一块工作,当一个程序启动时,主函数在一个单独的Goroutine中运行,我们叫它主要Goroutine。新的Goroutine会用去语句来创建。而去语言的并发设计,让我们很轻松就可以达成这一目的。

例如:

主要包
  
  导入(
  “fmt"
  “time"
  )
  
  函数foo () {
  我:=0
  真正的{
  我+ +
  fmt.Println(“新goroutine: i=?我)
  time . sleep (time.Second)
  }
  }
  
  函数main () {//创建一个goroutine,启动另外一个任务
  去foo ()
  
  我:=0
  真正的{
  我+ +
  fmt.Println(“主要goroutine: i=?我)
  time . sleep (time.Second)
  }
  }

结果:

主要goroutine: i=,1
新goroutine: i=,1
新goroutine: i=,2
主要goroutine: i=,2
主要goroutine: i=,3
新goroutine: i=,3


主去程退出后,其它的子去程也会自动退出:

主要包
  
  导入(
  “fmt"
  “time"
  )
  
  函数foo () {
  我:=0
  真正的{
  我+ +
  fmt.Println(“新goroutine: i=?我)
  time . sleep (time.Second)
  }
  }
  
  函数main () {//创建一个goroutine,启动另外一个任务
  去foo ()
  
  time . sleep(时间。第二个* 3)
  
  fmt.Println(“主要goroutine exit")
  }

运行结果:

新goroutine: i=,1
新goroutine: i=,2
新goroutine: i=,3
主要goroutine退出


<强> Gosched

runtime.Gosched()用于出让当前去程所占用的CPU时间片,让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次再获得CPU时间轮片的时候,从该出让CPU的位置恢复执行。

有点像跑接力赛,一个跑了一会碰到代码runtime.Gosched()就把接力棒交了给B,一歇着了,B继续跑。

例如:

主要包
  
  导入(
  “fmt"
  “runtime"
  “time"
  )
  
  函数main () {//创建一个goroutine
  func(字符串){
  我:=0;我& lt;2;我+ + {
  fmt.Println (s)
  }
  }(“world")
  
  我:=0;我& lt;2;我+ + {
  runtime.Gosched ()
  fmt.Println (“hello")
  }
  time . sleep(时间。第二个* 3)
  }

运行结果:


世界你好


如果没有runtime.Gosched()则运行结果如下:

你好


世界

注意:runtime.Gosched()只是出让一次机会,看下面的代码,注意运行结果:

主要包
  
  导入(
  “fmt"
  “runtime"
  “time"
  )
  
  函数main () {//创建一个goroutine
  func(字符串){
  我:=0;我& lt;2;我+ + {
  fmt.Println (s)
  time . sleep (time.Second)
  }
  }(“world")
  
  我:=0;我& lt;2;我+ + {
  runtime.Gosched ()
  fmt.Println (“hello")
  }
  }

运行结果:

世界你好


为什么世界只有一次呢?因为之前我们说过,主goroutine退出后,其它的工作goroutine也会自动退出。


调用runtime.Goexit()将立即终止当前goroutine执,# 12175;,调度器确保所有已注册推迟延迟调用被执行。

注意与返回的区别,回报是返回当前函数调用给调用者。

Golang Goroutine的使用方法有哪些