Golang协程详解
协程,也被称为协同程序,是一种比线程更小的执行单位。在单个线程中,多个协程间进行时间片轮转调度执行,这些协程能够获取CPU时间片来执行任务。
在Go语言中,协程也被称为goroutine。创建一个goroutine的方式是在函数调用前面加上go关键字。
解决方案1:创建一个简单的goroutine
package main
import (
"fmt"
"time"
)
func hello() {
fmt.Println("Hello world goroutine")
}
func main() {
go hello() // 创建一个goroutine
fmt.Println("main function done")
time.Sleep(1 * time.Second) // 等待1秒,确保goroutine运行结束
}
解决方案2:使用通道(channel)同步goroutine
package main
import (
"fmt"
"time"
)
func numbers(done chan bool) {
for i := 0; i < 5; i++ {
fmt.Println(i)
time.Sleep(1 * time.Second)
}
done <- true
}
func main() {
done := make(chan bool, 1)
go numbers(done) // 创建一个goroutine
<-done // 阻塞,直到从通道接收到值
fmt.Println("main function done")
}
解决方案3:使用select语句来处理通道发送和接收的阻塞问题
package main
import (
"fmt"
"time"
)
func print(s string, c chan int) {
fmt.Print(s)
time.Sleep(1 * time.Second)
c <- 1
}
func main() {
c1 := make(chan int)
c2 := make(chan int)
go print("hello", c1)
go print("world", c2)
for i := 0; i < 2; i++ {
select {
case <-c1:
fmt.Print(" ")
case <-c2:
fmt.Println()
}
}
}
解决方案4:使用goroutine池来管理goroutine
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 在函数退出时执行,表示goroutine已经完成工作
fmt.Println("Worker ", id, " starting.")
time.Sleep(2 * time.Second)
fmt.Println("Worker ", id, " ending.")
}
func main() {
max_workers := 3
for i := 0; i < max_workers; i++ {
wg.Add(1)
go worker(i, &wg) // 创建一个goroutine
}
fmt.Println("Waiting for workers to finish.")
wg.Wait() // 等待所有goroutine完成工作
}
以上代码展示了如何在Go语言中创建和管理goroutine。每个解决方案都有其特定的应用场景,可以根据实际需求选择合适的方案。
评论已关闭