当前位置: 首页 > 科技观察

Go语言中的Goroutines

时间:2023-03-21 21:33:05 科技观察

是什么基本概念Goroutine是Go运行时管理的轻量级线程(AgoroutineisalightweightthreadmanagedbytheGoruntime)。为什么不用现有的并发术语来解释Go语言中的并发呢?因为现有的线程、协程、进程等无法准确表达Goroutine。Goroutines使用方法函数类似于普通函数并发执行。当我们调用Goroutines时,只需要在函数前加上go关键字即可。在下面的示例中,goready()将并发执行。packagemainimport("fmt""time")funcready(){fmt.Println("在goroutine中运行func")}funcmain(){goready()time.Sleep(time.Second*3)fmt.Println("Mainfunctiondone")}匿名并发函数如果不想单独定义,可以使用匿名方法包mainimport("fmt""time")funcmain(){gofunc(){fmt.Println("Runanonymousfuncingoroutine.")}()time.Sleep(time.Second*3)fmt.Println("Mainfunctiondone")}如何控制并发在上面的例子中,我们故意等了3秒在main函数中,如果不在这3秒内会发生什么?我们把time.Sleep注释掉,因为没有使用time模块,所以还要注释掉packagemainimport("fmt"//"time")funcready(){fmt.Println("Runfuncinagoroutine")}funcmain(){goready()//time.Sleep(time.Second*3)fmt.Println("Mainfunctiondone")}此时我们发现Goroutine好像没有执行,因为只有main函数中的print语句输出Result:Mainfunctiondone那么是否触发了Goroutine?让我们再来看看这个例子。在这个例子中,main函数需要等待2秒,而在Goroutine中执行的函数需要等待5秒。packagemainimport("fmt""time")funcready(sint){fmt.Printf("在goroutine中运行func并等待%v\n",s)time.Sleep(time.Second*time.Duration(s))fmt.Printf("在goroutine中运行func并等待%v结束\n",s)}funcmain(){mainWaitSec:=2goready(5)fmt.Printf("运行Main函数并等待%v\n",mainWaitSec)time.Sleep(time.Second*time.Duration(mainWaitSec))fmt.Printf("运行Main函数并等待%v完成\n",mainWaitSec)}程序运行后,虽然mian函数和ready函数都打印了开始执行的语句,但是很明显Goroutine中的函数还没有执行。因此,为了更精准的控制Goroutine的并发,需要使用Channel来控制。运行Main函数并等待2Runfuncinagoroutine并等待5RunMain函数并等待2done