这篇文章将为大家详细讲解有关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的使用方法有哪些