做云图的网站,辛集城乡建设管理局网站,企业营销战略,山西建设官方网站Go 语言中的 Goroutine 是一种轻量级的并发执行单位。它可以与其他 Goroutine 并发地执行#xff0c;而不需要显式地管理线程的创建和销毁。Goroutine 是 Go 语言并发模型的核心组成部分#xff0c;它使得编写并发程序变得更加简单和高效。 例一
创建两个function#xff0… Go 语言中的 Goroutine 是一种轻量级的并发执行单位。它可以与其他 Goroutine 并发地执行而不需要显式地管理线程的创建和销毁。Goroutine 是 Go 语言并发模型的核心组成部分它使得编写并发程序变得更加简单和高效。 例一
创建两个function一个打印数字另一个打印字母分别通过routine并行运行源码和运行结果如下:
adminhpc-1:~/go/my_routine$ cat main.go
package mainimport (fmttime
)func printNumbers() {for i : 1; i 5; i {fmt.Println(i)time.Sleep(1 * time.Second)}
}func printLetters() {for i : a; i e; i {fmt.Printf(%c\n, i)time.Sleep(1 * time.Second)}
}func main() {go printNumbers() // 启动一个 Goroutine 执行 printNumbers 函数go printLetters() // 启动一个 Goroutine 执行 printLetters 函数// 主 Goroutine 继续执行其他操作time.Sleep(6 * time.Second) // 等待足够的时间以确保 Goroutine 执行完毕fmt.Println(Main Goroutine exits)
}
adminhpc-1:~/go/my_routine$
adminhpc-1:~/go/my_routine$ go run main.go
a
1
2
b
3
c
d
4
e
5
Main Goroutine exits
adminhpc-1:~/go/my_routine$ 说明 使用关键字go加函数调用来创建一个Goroutine两个Goroutine启动后分别同时独立执行可以看到打印的字符并非一对一个这里采用主程序简单等待6秒期望6秒内两个Goroutine都能运行结束然后运行主程序的print
例二
在 Go 语言中可以使用 sync.WaitGroup 来等待 Goroutine 的完成然后再继续主程序的执行下面是用WG改进后的源码和执行结果特意让printLetters多打印一些字符
adminhpc-1:~/go/my_routine$ cat main.go
package mainimport (fmtsynctime
)func printNumbers(wg *sync.WaitGroup) {defer wg.Done()for i : 1; i 5; i {fmt.Println(i)time.Sleep(1 * time.Second)}fmt.Println(Goroutine 1 finished)
}func printLetters(wg *sync.WaitGroup) {defer wg.Done()for i : a; i k; i {fmt.Printf(%c\n, i)time.Sleep(1 * time.Second)}fmt.Println(Goroutine 2 finished)
}func main() {var wg sync.WaitGroupwg.Add(2) // 设置 WaitGroup 的计数器为 2表示有两个 Goroutinego printNumbers(wg)go printLetters(wg)fmt.Println(Main program continues to run)wg.Wait()fmt.Println(All Goroutines have exited)
}
adminhpc-1:~/go/my_routine$
adminhpc-1:~/go/my_routine$
adminhpc-1:~/go/my_routine$ go run main.go
Main program continues to run
a
1
b
2
3
c
4
d
5
e
Goroutine 1 finished
f
g
h
i
j
k
Goroutine 2 finished
All Goroutines have exited
adminhpc-1:~/go/my_routine$ 说明 用go启动Goroutine的时候传递的是wg的指针而不是值,否则Goroutine操作的就是wg的不同副本了printNumbers执行完毕退出但是printLetters并未执行完主程序会继续等待