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

go语言创建协程

前言

        Go 语言中,协程是通过 go 关键字来创建的,这使得 Go 语言成为实现并发程序的一个非常直观和强大的工具。Go 运行时管理着协程,这些协程在内部被称为 goroutine。

        协程(goroutines)本身是轻量级的线程,由 Go 运行时管理。它们设计为非阻塞的,因为 Go 运行时会在一个协程阻塞时(例如,由于I/O操作)自动切换到其他协程继续执行,从而提高程序的并发性能。

一、测试用例

package mainimport ("fmt""time"
)// 定义一个函数,该函数将由协程执行
func printNumbers() {for i := 0; i < 10; i++ {fmt.Println(i)// 延时处理time.Sleep(100 * time.Millisecond)}
}func main() {// 使用 go 关键字启动协程go printNumbers()// 非阻塞 主函数继续执行,不会等待协程完成for i := 0; i < 5; i++ {fmt.Printf("Main is running: %d\n", i)time.Sleep(200 * time.Millisecond)}}

程序的退出依赖于主函数的结束,但在go语言中协程是并发运行的,它们有自己的执行栈和运行状态。如果协程在主函数结束后还在运行,它们将继续执行,直到协程执行完毕自然退出。

二、协程与通道的使用

package mainimport ("fmt""sync"
)func consumer(id int, ch <-chan int, wg *sync.WaitGroup) {for n := range ch {fmt.Printf("Consumer %d received %d\n", id, n)}wg.Done()
}func main() {ch := make(chan int)var wg sync.WaitGroupfor i := 1; i <= 3; i++ {wg.Add(1)go consumer(i, ch, &wg)}for n := 1; n <= 9; n++ {ch <- n}close(ch)wg.Wait()fmt.Println("All consumers are done.")
}

协程(goroutines)和通道(channels)是并发编程的两个基本工具,经常结合在一起使用,以实现复杂的并发模式。协程是轻量级的线程;而通道提供了协程之间的通信机制。

以上的生产者-消费者模式:创建了三个消费者的协程,并往通道中写入数据,协程再将数据进行打印输出。通道用来在协程之间传递数据,也作为同步机制来控制协程的执行顺序。 

http://www.lryc.cn/news/418069.html

相关文章:

  • RabbitMQ之基于注解声明队列交换机:使用@RabbitListener实现消息监听
  • 【grafana 】mac端grafana配置的文件 grafana.ini 及login
  • 程序员如何在人工智能时代保持核心竞争力
  • 回溯排列+棋盘问题篇--代码随想录算法训练营第二十三天| 46.全排列,47.全排列 II,51. N皇后,37. 解数独
  • ESXI加入VMware现有集群提示常规性错误
  • 数字噪音计(声级计)【AR814数字噪音计】
  • 【Vue3】图片未加载成功前占位
  • AbstractQueuedSynchronizer之AQS
  • <数据集>起重机识别数据集<目标检测>
  • 04--Docker
  • MiniCPM-V: A GPT-4V Level MLLM on Your Phone 手机上的 GPT-4V 级多模态大模型
  • Unity初识
  • 【游戏引擎之路】登神长阶(九)——《3D游戏编程大师技巧》:我想成为游戏之神!
  • Linux:线程同步之信号量
  • GPT-SoVITS-文本转语音(你的声音不再是唯一)
  • C语言深度剖析(部分)--剩下随缘更新
  • 计算机毕业设计选题推荐-电缆行业生产管理系统-Java/Python项目实战
  • Linux 下查看 CPU 使用率
  • 数理基础知识
  • Java解决lombok和mapstruct编译模块的问题
  • 大模型场景应用全集:持续更新中
  • 理解RabbitMQ中的消息存储机制:非持久化、持久化与惰性队列(Lazy Queue)
  • 【机器学习】BP神经网络正向计算
  • 谷粒商城实战笔记-108~109-elasticsearch删除与批量导入
  • RabbitMQ:发送者的可靠性之使用消息确认回调
  • HCIP学习 | OSPF---LSA限制、不规则区域、附录E、选路
  • CVE-2017-15715~Apache解析漏洞【春秋云境靶场渗透】
  • thinkphp 5.0.24生成模块
  • 值得注意!家里有带毛发动物就有浮毛?宠物空气净化器一键净化
  • Linux 代理(proxy)设置