使用channel可实现协程同步,如通过无缓冲channel等待任务完成:main函数创建done通道,启动协程执行任务并发送完成信号,主线程接收信号后继续,确保任务结束前不退出。

在Golang中,协程(goroutine)之间的同步主要依赖于通道(channel)和标准库提供的同步原语。合理使用这些机制可以避免竞态条件、死锁等问题,确保多个协程协同工作时数据一致且执行有序。
使用 channel 进行协程通信与同步
Go提倡“通过通信共享内存”,而不是通过共享内存来通信。channel 是实现这一理念的核心工具。
无缓冲 channel 可用于两个协程间的同步点,比如等待某个任务完成:
示例:使用 channel 等待协程结束
func main() {
done := make(chan bool)
go func() {
fmt.Println(“开始执行任务”)
time.Sleep(1 * time.Second)
fmt.Println(“任务完成”)
done }()
fmt.Println(“等待任务完成…”)
fmt.Println(“主程序退出”)
}
这里,主协程通过从 done 通道接收信号,实现对子协程的等待。
立即学习“go语言免费学习笔记(深入)”;
使用 sync.WaitGroup 等待多个协程
当需要等待多个协程完成时,sync.WaitGroup 更加方便。
它有三个方法:Add、Done、Wait。
v1.1.6若依管理系统
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。您是否在找一套合适后台管理系统。您是否在找一套代码易读易懂后台
885 查看详情
示例:WaitGroup 控制多个协程同步
func main() {
var wg sync.WaitGroup
for i := 0; i wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Printf(“协程 %d 开始工作n”, id)
time.Sleep(time.Second)
fmt.Printf(“协程 %d 完成n”, id)
}(i)
}
wg.Wait()
fmt.Println(“所有协程已完成”)
}
注意:Add 应在 goroutine 启动前调用,避免竞态;Done 通常用 defer 调用以确保执行。
使用 sync.Mutex 保护共享资源
当多个协程需要读写同一变量时,应使用互斥锁防止数据竞争。
示例:用 Mutex 保护计数器
func main() {
var mu sync.Mutex
var counter int
var wg sync.WaitGroup
for i := 0; i wg.Add(1)
go func() {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}()
}
wg.Wait()
fmt.Println(“最终计数:”, counter)
}
如果不加锁,counter++ 可能出现竞态,结果小于预期。
结合 channel 和 context 实现超时控制
在实际应用中,常需限制协程执行时间。使用 context.WithTimeout 配合 channel 可安全中断操作。
示例:带超时的协程同步
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
ch := make(chan string)
go func() {
time.Sleep(3 * time.Second)
ch }()
select {
case result := fmt.Println(result)
case fmt.Println(“任务超时”)
}
}
这样即使协程未完成,也能在超时后继续执行,避免主程序卡住。
基本上就这些。根据场景选择合适的同步方式:简单通知用 channel,批量等待用 WaitGroup,共享变量加 Mutex,复杂控制结合 context。关键是避免死锁和竞态,保证程序健壮。
以上就是如何在Golang中实现协程间同步的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1156357.html
微信扫一扫
支付宝扫一扫