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
相关推荐
LorryJovens16 分钟前
【LAAP科研】CEN因果等价网络理论---从双缝干涉到因果等价
开发语言·php
Brilliantwxx1 小时前
【Linux】 进程(10) 进程控制深度解析:创建、终止与等待
linux·运维·服务器·c语言·开发语言·网络
卢锡荣2 小时前
国产PD3.1全集成Type-C管控芯片LDR6020P
c语言·开发语言
IT_陈寒2 小时前
Redis缓存雪崩把我坑惨了,这次长记性了
前端·人工智能·后端
Freak嵌入式2 小时前
Pico UART 数据收发实战:硬件配置、MicroPython 编程
java·开发语言·单片机·嵌入式硬件·生活
Casual2 小时前
【网络基础进阶】:看懂子网划分与 VLAN
开发语言·网络·php
LucianaiB2 小时前
用 WorkBuddy 研究腾讯、阿里和 DeepSeek,我没敢直接说「AI 很赚钱」
后端
用户8356290780513 小时前
使用 Python 管理 PDF 属性和元数据
后端·python
分支预测失败3 小时前
RISC-V 上下文切换实战:从 Trap 入口到 Linux 进程调度
后端·嵌入式
cfm_29143 小时前
线程池阻塞队列
java·开发语言