Golang教程:(二十一)协程
原文:https://golangbot.com/goroutines/ 在上一篇教程中,我们讨论了并发,以及并发和并行的区别。在这篇教程中我们将讨论在Go中如何通过Go协程实现并发。 什么是协程Go协程(Goroutine)是与其他函数或方法同时运行的函数或方法。可以认为Go协程是轻量级的线程。与创建线程相比,创建Go协程的成本很小。因此在Go中同时运行上千个协程是很常见的。 Go协程对比线程的优点
如何创建一个协程?在函数或方法调用之前加上关键字 让我们创建一个协程: package main
import (
"fmt"
)
func hello() {
fmt.Println("Hello world goroutine")
}
func main() {
go hello()
fmt.Println("main function")
}
在 Playground 中运行 第11行, 运行这个程序,你将得到一个惊喜。 程序仅输出了一行文本:
我想你已经知道了为什么我们的协程为什么没有运行。在11行调用 让我们修复这个问题: 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")
}
在 Playground 中运行 上面的程序中,第13行,我们调用 time 包的 在主协程中使用 Sleep 函数等待其他协程结束的方法是不正规的,我们用在这里只是为了说明Go协程是如何工作的。信道可以用于阻塞主协程,直到其他协程执行完毕。我们将在下一篇教程中讨论信道。 开启多个协程让我们写一个程序开启多个协程来更好的理解协程。 package main
import (
"fmt"
"time"
)
func numbers() {
for i := 1; i <= 5; i++ {
time.Sleep(250 * time.Millisecond)
fmt.Printf("%d ",i)
}
}
func alphabets() {
for i := 'a'; i <= 'e'; i++ {
time.Sleep(400 * time.Millisecond)
fmt.Printf("%c ",i)
}
}
func main() {
go numbers()
go alphabets()
time.Sleep(3000 * time.Millisecond)
fmt.Println("main terminated")
}
在 Playground 中运行 上面的程序在第21和22行开启了两个协程。现在这两个协程同时执行。 程序的输出为: 1 a 2 3 b 4 c 5 d e main terminated
下面的图片描述了这个程序是如何工作的,请在新的标签中打开图像以获得更好的效果:) 上图中,蓝色的线框表示 Go协程的介绍就到这里。祝你有美好的一天! 目录 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |