标签:教程 一起 port tps amp fps code hello 通过
在上一篇中,我们讨论了并发,以及并发和并行的区别。在这篇教程中我们将讨论在Go中如何通过Go协程实现并发。
Go协程(Goroutine)是与其他函数或方法同时运行的函数或方法。可以认为Go协程是轻量级的线程。与创建线程相比,创建Go协程的成本很小。因此在Go中同时运行上千个协程是很常见的。
在函数或方法调用之前加上关键字 go
,这样便开启了一个并发的Go协程。
让我们创建一个协程:
package main import ( "fmt" ) func hello() { fmt.Println("Hello world goroutine") } func main() { go hello() fmt.Println("main function") }
第11行,go hello()
开启了一个新的协程。现在 hello()
函数将和 main()
函数一起运行。main
函数在单独的协程中运行,这个协程称为主协程。
运行这个程序,你将得到一个惊喜。
程序仅输出了一行文本: main function
。我们创建的协程发生了什么?我们需要了解Go协程的两个属性,以了解为什么发生这种情况。
我想你已经知道了为什么我们的协程为什么没有运行。在11行调用 go hello()
后,程序的流程直接调转到下一条语句执行,并没有等待 hello
协程退出,然后打印 main function
。接着主协程结束运行,不会再执行任何代码,因此 hello
协程没有得到运行的机会。
让我们修复这个问题:
package main import ( "fmt" "time" ) func hello() { fmt.Println("Hello world goroutine") } func main() { go hello() time.Sleep(1 * time.Second) fmt.Println("main function") }
上面的程序中,第13行,我们调用 time 包的 Sleep 函数来使调用该函数所在的协程休眠。在这里是让主协程休眠1秒钟。现在调用 go hello()
有了足够的时间得以在主协程退出之前执行。该程序首先打印 Hello world goroutine
,等待1秒钟之后打印 main function
。
在主协程中使用 Sleep 函数等待其他协程结束的方法是不正规的,我们用在这里只是为了说明Go协程是如何工作的。信道可以用于阻塞主协程,直到其他协程执行完毕。我们将在下一篇教程中讨论信道。
本文转自:https://blog.csdn.net/u011304970/article/details/75096323?locationNum=3&fps=1
标签:教程 一起 port tps amp fps code hello 通过
原文地址:https://www.cnblogs.com/liuzhongchao/p/9120991.html