180课时吃透Go语言游戏后端开发11:Go语言中的并发编程

第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传递的数据类型,多实践才能更好地掌握并发编程。如果遇到问题,欢迎评论区留言。

每一次点赞 ,都是你无声的鼓励。每一次关注,都是我前行的动力。感谢有你,一起成长!

相关推荐
SmalBox29 分钟前
【节点】[Distance节点]原理解析与实际应用
unity3d·游戏开发·图形学
审判长烧鸡2 小时前
【Go i18n】TOML语言包
go·i18n·语言包
用户398346161207 小时前
Go-Spring 实战第 10 课 —— 依赖注入的方式:字段注入和构造函数注入
spring·go
用户398346161209 小时前
Go-Spring 实战第 9 课 —— IoC 容器:复杂 Go 应用如何统一对象装配
spring·go
李燚9 小时前
ReAct 循环的 50 行 Go 实现,逐行拆解
javascript·人工智能·react.js·golang·aigc·agent
审判长烧鸡9 小时前
【Go Generics】泛型为何而生的
go·泛型·overload·重载·generics
用户3983461612010 小时前
Go-Spring 实战第 8 课 —— 变量引用与动态刷新:配置值如何复用和更新
spring·go
念何架构之路11 小时前
Go pprof性能剖析
开发语言·后端·golang
姚不倒11 小时前
Go语言实战:构建一个安全的计算器服务(接口、错误处理与Panic恢复)
云原生·golang
XMYX-01 天前
37 - Go env 环境变量:配置管理与运行时控制
开发语言·golang