Go语言通过goroutine和channel实现高效并发,goroutine是轻量级线程,用go关键字启动,开销小;配合sync.WaitGroup协调执行,确保主函数等待所有任务完成;通过channel进行数据传递,避免共享内存,实现安全通信。

Go语言的并发能力是其核心优势之一,它通过goroutine和channel提供了简单高效的并发编程模型。理解这些基础概念并掌握基本用法,是编写高性能Go程序的关键。
什么是Goroutine
Goroutine是Go运行时管理的轻量级线程,由Go runtime调度,开销极小。启动一个goroutine只需在函数调用前加上go关键字。
与操作系统线程相比,goroutine的栈空间初始很小(通常2KB),可动态伸缩,因此可以轻松创建成千上万个goroutine而不影响性能。
示例:
func sayHello() { fmt.Println("Hello from goroutine")}func main() {go sayHello() // 启动一个goroutinetime.Sleep(100 * time.Millisecond) // 等待goroutine执行完成fmt.Println("Main function")}
如何有效使用Goroutine
实际开发中,直接使用time.Sleep等待并不现实。更合理的做法是使用sync.WaitGroup来协调多个goroutine的执行。
立即学习“go语言免费学习笔记(深入)”;
WaitGroup用于等待一组操作完成Add增加计数,Done减少计数,Wait阻塞直到计数归零示例:使用WaitGroup等待多个goroutine
func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d startingn", id) time.Sleep(time.Second) fmt.Printf("Worker %d donen", id)}func main() {var wg sync.WaitGroup
for i := 1; i <= 3; i++ { wg.Add(1) go worker(i, &wg)}wg.Wait() // 阻塞直到所有worker完成fmt.Println("All workers finished")
}
配合Channel进行通信
Goroutine之间不应共享内存,而应通过channel传递数据。channel是Go中用于goroutine间通信的管道,支持值的发送和接收。
使用make(chan Type)创建channel可设置缓冲区大小,实现异步通信示例:通过channel传递结果
func fetchData(ch chan string) { time.Sleep(2 * time.Second) ch <- "data fetched"}func main() {ch := make(chan string)go fetchData(ch)result := <-ch // 接收数据fmt.Println(result)}
基本上就这些。掌握goroutine的基本用法、配合WaitGroup做同步、用channel做通信,就能应对大多数并发场景。不复杂但容易忽略的是:别忘了协调生命周期,避免主函数退出过早导致goroutine没机会执行。
以上就是Golang并发基础与goroutine使用方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1405358.html
微信扫一扫
支付宝扫一扫