golang的协程

  1. 启动一个协程
    使用go关键字启动一个新的协程时,就是并发地执行一个函数。换句话说,go关键字后面必须跟着一个可调用的函数(或者是一个匿名函数、闭包等)。
go 复制代码
func sayHello() {   fmt.Println("Hello, World!")  }    
func main() {  go sayHello() // 启动一个新的协程 }
  1. 子协程的生命周期
    • 当主协程结束时,会立即终止所有其他协程。为了确保子协程在主协程退出前完成,可以使用同步机制如 sync.WaitGroup、通道(channel)或 context 包。
    • 使用go起一个协程后,子协程是并发的,并不影响原程序继续执行,并不会阻塞,所以要防止主协程在子协程结束前退出。
  2. select
    • select语句用于处理多个通信操作,它类似于 switch 语句,但它专门用于处理通道(channel)。它会在多个通道操作上等待,直到其中一个通道可以进行发送或接收操作。
    • select 语句会阻塞,直到其中一个 case 可以执行。如果有多个 case 都可以执行,select 会随机选择一个执行。
    • 如果某个通道被关闭,接收操作会立即成功并返回通道类型的零值,而无需阻塞。
go 复制代码
select {  
	case <-chan1:  
	    // 当从chan1成功接收到数据时执行的代码  
	case chan2 <- 1:  
	    // 当成功向chan2发送数据时执行的代码  
	default:  
	    // 如果没有任何通道操作准备就绪时执行的代码  
}
  1. channel
    在Go语言中,channel是一种用于协程(goroutine)之间进行通信和数据同步的机制。它可以被看作是一种特殊的数据类型,类似于队列或管道,用于在不同的协程之间传递数据。
    • 如果向一个未初始化的channel发送数据,发送操作会永远阻塞。
    • 关闭后的channel不能再发送数据,否则会导致运行时错误。
    • 从已关闭的channel接收数据会得到零值:当channel被关闭且没有更多数据时,接收操作会立即返回一个对应类型的零值。
    • 关闭channel不是必须的:只有在通知接收方所有的数据都发送完毕的时候才需要关闭channel。关闭一个已经关闭的channel会导致panic。
  2. context
    我的博客:https://blog.csdn.net/m0_51866860/article/details/142234364
相关推荐
Victor3566 分钟前
MongoDB(87)如何使用GridFS?
后端
Victor3569 分钟前
MongoDB(88)如何进行数据迁移?
后端
初夏睡觉11 分钟前
c++1.3(变量与常量,简单数学运算详解),草稿公放
开发语言·c++
升职佳兴19 分钟前
C盘爆满自救:3步无损迁移应用数据到E盘(含回滚)
c语言·开发语言
ID_1800790547322 分钟前
除了 Python,还有哪些语言可以解析 JSON 数据?
开发语言·python·json
小红的布丁26 分钟前
单线程 Redis 的高性能之道
redis·后端
GetcharZp31 分钟前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
周末也要写八哥1 小时前
多进程和多线程的特点和区别
java·开发语言·jvm
宁瑶琴2 小时前
COBOL语言的云计算
开发语言·后端·golang
普通网友2 小时前
阿里云国际版服务器,真的是学生党的性价比之选吗?
后端·python·阿里云·flask·云计算