当前位置: 首页 > news >正文

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

在这里插入图片描述

第11课我们来讲Go语言中的并发编程。在游戏开发里,并发编程可是个厉害的“武器”,它能让游戏同时做很多事情,就像游戏角色一边移动,一边播放技能特效,还能实时处理网络消息,这些都可以通过并发编程来实现。

goroutine协程

goroutine是Go语言实现并发的核心,它就像是一个轻量级的线程。你可以想象成是游戏里同时进行的多个“小任务”。使用关键字go调用函数就会创建一个goroutine。

package mainimport ("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() {// 启动第一个goroutinego task("协程1")// 启动第二个goroutinego task("协程2")// 主线程休眠5秒,确保goroutine有足够时间执行time.Sleep(5 * time.Second)fmt.Println("主协程结束")
}

将以上代码写入main.go,运行结果如下:

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可以通过它发送和接收数据。

package mainimport ("fmt""time"
)// 生产者函数,向channel发送数据
func producer(ch chan int) {for i := 0; i < 5; i++ {ch <- ifmt.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,运行结果如下:

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

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

http://www.dtcms.com/a/473485.html

相关文章:

  • 江苏建设部官方网站纯 flash 网站
  • Oracle OMF 配置文档
  • 帮别人做网站怎么赚钱wordpress 静态设置
  • SpringBoot Jar包冲突在线检测
  • 基于OpenCV的通过人脸对年龄、性别、表情与疲劳进行检测
  • vue3 类似 Word 修订模式,变更(插入、删除、修改)可以实时查看标记 如何实现
  • LLM 笔记 —— 07 Tokenizers(BPE、WordPeice、SentencePiece、Unigram)
  • Serverless数据库架构:FaunaDB+Vercel无缝集成方案
  • 【自然语言处理】“bert-base-chinese”的基本用法及实战案例
  • LLM 笔记 —— 08 Embeddings(One-hot、Word、Word2Vec、Glove、FastText)
  • 广告公司网站设计策划phpcmsv9手机网站
  • 【Qt】乌班图安装Qt环境
  • 边缘计算中的前后端数据同步:Serverless函数与Web Worker的异构处理
  • Windows Pad平板对 Qt 的支持
  • 基于JETSON ORIN/RK3588+AI相机:机器人-多路视觉边缘计算方案
  • 没有网怎么安装wordpress沈阳企业网站优化排名方案
  • 【C++STL :list类 (二) 】list vs vector:终极对决与迭代器深度解析 揭秘list迭代器的陷阱与精髓
  • 虚幻引擎入门教程:虚幻引擎的安装
  • FastbuildAI后端服务启动流程分析
  • AI×Cursor 零基础前端学习路径:避误区学HTML/CSS/JS
  • 新手小白——Oracle数据库.索引与数据完整性
  • 免费注册网站软件网站制作 东莞
  • Redis 的璀璨明珠:深入剖析有序集合 (ZSET) 的奥秘与艺术
  • 【Linux网络编程】多路转接reactor——ET模式的epoll
  • 深入理解线程池:核心处理流程与工作原理
  • 关于unity一个场景中存在多个相机时Game视图的画面问题
  • 中国室内设计网站排名太原建设银行网站
  • 手写MyBatis第104弹:SqlSession从工厂构建到执行器选择的深度剖析
  • 【力扣 SQL 50】连接
  • 手机的网站有哪些女装网站建设规划书