
第11课我们来讲Go语言中的并发编程。在游戏开发里,并发编程可是个厉害的"武器",它能让游戏同时做很多事情,就像游戏角色一边移动,一边播放技能特效,还能实时处理网络消息,这些都可以通过并发编程来实现。
goroutine协程
goroutine是Go语言实现并发的核心,它就像是一个轻量级的线程。你可以想象成是游戏里同时进行的多个"小任务"。使用关键字go
调用函数就会创建一个goroutine。
go
package main
import (
"fmt"
"time"
)
// 定义一个简单的函数,模拟一个任务
func task(name string) {
for i := 0; i < 3; i++ {
fmt.Printf("%s: 执行任务 %d\n", name, i)
time.Sleep(time.Second)
}
}
func main() {
// 启动第一个goroutine
go task("协程1")
// 启动第二个goroutine
go task("协程2")
// 主线程休眠5秒,确保goroutine有足够时间执行
time.Sleep(5 * time.Second)
fmt.Println("主协程结束")
}
将以上代码写入main.go,运行结果如下:
bash
leicw@Code AI世界:code011$ go run main.go
协程2: 执行任务 0
协程1: 执行任务 0
协程2: 执行任务 1
协程1: 执行任务 1
协程1: 执行任务 2
协程2: 执行任务 2
主协程结束
在这个例子中,task
函数是一个简单的任务,它会循环3次,每次打印一条信息并休眠1秒。在main
函数里,通过go task("协程1")
和go task("协程2")
启动了两个goroutine,它们会并行执行,协程1和协程2的执行顺序互不受影响,因此重新运行程序他们的顺序可能会发生变化,但是每个协程内的执行顺序是确定的。这里的go
关键字会让函数在一个新的goroutine中异步运行,不会阻塞主线程。最后主线程休眠5秒,是为了确保两个goroutine有足够的时间执行完毕,否则主线程结束,程序就会终止,goroutine也会随之结束。
channel
虽然goroutine可以并行执行任务,但有时候它们之间需要相互通信和同步,这时候就用到了channel。channel就像是一个管道,goroutine可以通过它发送和接收数据。
go
package main
import (
"fmt"
"time"
)
// 生产者函数,向channel发送数据
func producer(ch chan int) {
for i := 0; i < 5; i++ {
ch <- i
fmt.Printf("生产者发送: %d\n", i)
}
close(ch)
}
// 消费者函数,从channel接收数据
func consumer(ch chan int) {
for num := range ch {
fmt.Printf("消费者接收: %d\n", num)
}
}
func main() {
ch := make(chan int)
go producer(ch)
go consumer(ch)
// 主线程休眠5秒,确保goroutine有足够时间执行
time.Sleep(5 * time.Second)
fmt.Println("主协程结束")
}
将以上代码写入main.go,运行结果如下:
bash
leicw@Code AI世界:code011$ go run main.go
生产者发送: 0
消费者接收: 0
消费者接收: 1
生产者发送: 1
生产者发送: 2
消费者接收: 2
消费者接收: 3
生产者发送: 3
生产者发送: 4
消费者接收: 4
主协程结束
这里定义了producer
函数作为生产者,它向ch
这个channel发送0到4的数据,发送完后通过close(ch)
关闭channel consumer
函数作为消费者,通过for - range
从channel接收数据,直到channel被关闭。在main
函数里,创建了channel,并启动了生产者和消费者的goroutine,这两个goroutine是并行运行的。从运行结果可以发现,生产者发送的数据及时通过channel传递给了消费者goroutine。
在游戏开发中,可以用goroutine来处理网络消息的接收和处理,用channel在网络处理和游戏逻辑之间传递数据。你可以试着修改这些示例代码,比如增加更多的goroutine,或者改变channel传递的数据类型,多实践才能更好地掌握并发编程。如果遇到问题,欢迎评论区留言。
每一次点赞 ,都是你无声的鼓励。每一次关注,都是我前行的动力。感谢有你,一起成长!