当前位置: 首页 > 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)是并发编程的两个基本工具,经常结合在一起使用,以实现复杂的并发模式。协程是轻量级的线程;而通道提供了协程之间的通信机制。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 4章7节:用R做数据重塑,行列命名和数据类型转换
  • 【IT行业研究报告】Internet Technology
  • Android网络库:Volley、Retrofit和OkHttp的比较与应用
  • ARM/Linux嵌入式面经(二一):诺瓦科技
  • Spring Boot 的Web开发
  • Linux 下 ETCD 安装、配置与命令使用总结
  • 【Spark集群部署系列二】Spark StandAlone模式介绍和搭建以及使用
  • Docker运行Cassandra集群
  • 如何选择工厂模式或策略模式:Java设计模式实践指南
  • mmdebstrap:创建 Debian 系统 chroot 环境的利器 ️
  • LeetCode138-随机链表的复制--经典OJ题
  • 视频循环存储的实现
  • 嵌入式学习笔记十三——C语言指针变量、一维数组的指针、快速排序
  • 25考研计算机组成原理复习·3.3主存储器与CPU的连接·3.4外部存储器
  • Web前端开发环境搭建
  • Android优雅地处理按钮重复点击
  • classpath对获取配置文件的影响
  • es的写入过程
  • Java反射-动态类加载和重新加载
  • JDK 6和JDK 7中的substring()方法
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Node 版本管理
  • node-glob通配符
  • vue2.0项目引入element-ui
  • 算法-插入排序
  • 通过npm或yarn自动生成vue组件
  • 以太坊客户端Geth命令参数详解
  • 中文输入法与React文本输入框的问题与解决方案
  • FaaS 的简单实践
  • NLPIR智能语义技术让大数据挖掘更简单
  • PostgreSQL之连接数修改
  • 带你开发类似Pokemon Go的AR游戏
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • $(function(){})与(function($){....})(jQuery)的区别
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十六)视图变换 正交投影 透视投影
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)程序员疫苗:代码注入
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)OpenStack Hacker养成指南
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .cn根服务器被攻击之后
  • .net wcf memory gates checking failed
  • @RequestBody与@RequestParam