Go语言通过goroutine和channel实现高效并发,使用go关键字启动goroutine;2. 主goroutine不等待其他goroutine,需用sync.WaitGroup同步,通过Add、Done、Wait方法确保所有任务完成。

Go语言的并发模型基于goroutine和channel,使得编写高并发程序变得简单高效。goroutine是Go运行时调度的轻量级线程,启动成本低,一个Go程序可以轻松启动成千上万个goroutine。
在函数或方法调用前加上go关键字,即可让该函数在新的goroutine中执行。
示例:go func() {<br>
fmt.Println("Hello from goroutine")<br>
}()主goroutine(main函数)不会等待其他goroutine结束。如果主程序退出,所有未完成的goroutine都会被强制终止。
当需要等待一组goroutine完成时,可使用sync.WaitGroup进行同步。
立即学习“go语言免费学习笔记(深入)”;
常用方法:示例代码:
var wg sync.WaitGroup<br><br>
for i := 0; i < 3; i++ {<br>
wg.Add(1)<br>
go func(id int) {<br>
defer wg.Done()<br>
fmt.Printf("Goroutine %d done\n", id)<br>
}(i)<br>
}<br><br>
wg.Wait() // 等待所有goroutine完成channel是goroutine之间传递数据的安全方式,避免了共享内存带来的竞态问题。
创建channel:ch := make(chan string)
向channel发送数据:ch <br>从channel接收数据:<code>value :=
带缓冲的channel:
ch := make(chan int, 5) // 缓冲大小为5
缓冲channel非阻塞发送,直到缓冲区满为止。
实际应用示例:生产者-消费者模型
func producer(ch chan<- int) {<br>
for i := 0; i < 5; i++ {<br>
ch <- i<br>
time.Sleep(time.Millisecond * 100)<br>
}<br>
close(ch)<br>
}<br><br>
func consumer(ch <-chan int, wg *sync.WaitGroup) {<br>
defer wg.Done()<br>
for value := range ch {<br>
fmt.Println("Received:", value)<br>
}<br>
}主函数中启动生产者和消费者:
ch := make(chan int)<br> var wg sync.WaitGroup<br><br> wg.Add(1)<br> go producer(ch)<br> go consumer(ch, &wg)<br> wg.Wait()
goroutine虽然方便,但也容易引发以下问题:
使用context控制goroutine生命周期:
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)<br>
defer cancel()<br><br>
go func() {<br>
select {<br>
case <-time.After(3 * time.Second):<br>
fmt.Println("Work done")<br>
case <-ctx.Done():<br>
fmt.Println("Cancelled due to timeout")<br>
}<br>
}()<br><br><-ctx.Done() // 等待上下文结束基本上就这些。掌握goroutine、channel、WaitGroup和context的组合使用,就能写出稳定高效的并发程序。关键是理解“不要通过共享内存来通信,而应该通过通信来共享内存”这一Go并发哲学。
以上就是Golang如何使用goroutine实现并发_Golang goroutine并发编程实践的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号