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

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

相关推荐
用户7227868123448 小时前
go ants pool 协程池学习笔记
go
自学AI的鲨鱼儿9 小时前
cursor 使用 gvm管理的go的环境出现 Failed to find the “go“ binary in either GOROOT() 错误
golang·cursor·gvm
席万里10 小时前
Go开源库gcurl实际生产级应用
开发语言·后端·golang
ChineHe14 小时前
Golang并发编程篇002_Go并发基础
开发语言·后端·golang
哈茶真的c1 天前
【书籍心得】左耳听风:传奇程序员练级攻略
java·c语言·python·go
麻辣兔变形记1 天前
基于 Go‑Zero 的用户 CRUD Demo:如何一步步从 MySQL + sqlx 演进为 PostgreSQL + GORM + 微服务架构
mysql·微服务·postgresql·架构·golang
i***27951 天前
【golang学习之旅】使用VScode安装配置Go开发环境
vscode·学习·golang
心月狐的流火号1 天前
Go sync.Mutex 源码解析:设计哲学与工程智慧
go·源码阅读
Anthony_49262 天前
【踩坑】gorm 回写主键不正确
mysql·go·orm
le serein —f2 天前
用go实现-反转链表
leetcode·链表·golang