Golang通过go关键字启动goroutine实现并发,配合channel进行通信,使用WaitGroup等待执行完成,避免竞态与泄漏。

在Golang中实现goroutine并发执行非常直接,Go语言通过轻量级线程(goroutine)和通道(channel)提供了强大的并发支持。你只需要在函数调用前加上 go 关键字,就能启动一个新goroutine并发运行。
启动基本的goroutine
每个goroutine是一个独立执行的函数,由Go运行时调度管理。它比操作系统线程更轻量,可以轻松创建成千上万个。
示例:
package mainimport ("fmt""time")
func sayHello() {fmt.Println("Hello from goroutine")}
func main() {go sayHello() // 启动一个goroutinetime.Sleep(100 * time.Millisecond) // 等待goroutine执行完成fmt.Println("Main function ends")}
如果不加 time.Sleep,主程序可能在goroutine执行前就退出了,导致看不到输出。
使用channel进行goroutine通信
多个goroutine之间不能直接共享内存通信,推荐使用channel传递数据,避免竞态条件。
立即学习“go语言免费学习笔记(深入)”;
示例:带缓冲的channel控制并发
package mainimport "fmt"
func worker(id int, jobs <-chan int, results chan<- int) {for job := range jobs {fmt.Printf("Worker %d processing job %dn", id, job)results <- job * 2}}
func main() {jobs := make(chan int, 5)results := make(chan int, 5)
// 启动3个worker goroutinefor w := 1; w <= 3; w++ { go worker(w, jobs, results)}// 发送5个任务for j := 1; j <= 5; j++ { jobs <- j}close(jobs)// 收集结果for a := 1; a <= 5; a++ { <-results}
}
使用sync.WaitGroup等待所有goroutine完成
当不需要返回值时,可以用 sync.WaitGroup 来等待一组goroutine执行完毕。
示例:
package mainimport ("fmt""sync")
func task(id int, wg *sync.WaitGroup) {defer wg.Done()fmt.Printf("Task %d is donen", id)}
func main() {var wg sync.WaitGroup
for i := 1; i <= 5; i++ { wg.Add(1) go task(i, &wg)}wg.Wait() // 阻塞直到所有task调用Done()fmt.Println("All tasks completed")
}
基本上就这些。合理使用go关键字、channel和WaitGroup,就能高效安全地实现并发。注意避免常见问题如goroutine泄漏、死锁和竞态条件。配合context包还能实现超时控制和取消机制。不复杂但容易忽略细节。
以上就是如何在Golang中实现goroutine并发执行的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1414836.html
微信扫一扫
支付宝扫一扫