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

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

相关推荐
cr7xin4 小时前
go语言结构体内存对齐
后端·golang
Java陈序员8 小时前
简单好用!一款针对 IT 团队开发的文档管理系统!
mysql·docker·go
Yeats_Liao11 小时前
Go语言 实现 TCP 端口扫描器
网络·tcp/ip·golang
程序员爱钓鱼13 小时前
Go语言实战案例——进阶与部署篇:性能优化与 pprof 性能分析实践
后端·google·go
_小许_20 小时前
Go语言实现HTML转PDF
golang·pdf·html
半路程序员1 天前
Go语言学习(四)
开发语言·学习·golang
秦禹辰1 天前
轻量级开源文件共享系统PicoShare本地部署并实现公网环境文件共享
开发语言·后端·golang
数据知道1 天前
Go基础:一文掌握Go语言泛型的使用
开发语言·后端·golang·go语言
动态一时爽,重构火葬场1 天前
Kubernetes 之海,Go 之舟:避开那些吞噬性能的隐形暗礁
容器·golang·kubernetes