与“golang并发”相关的TAG标签
goroutine数量需依任务类型而定:CPU密集型任务应控制在runtime.NumCPU()附近,避免调度开销;IO密集型任务可设几十至数百,但须配超时与连接池。
goroutine本质是加go前缀启动函数,但需同步控制、显式传参、配合channel或WaitGroup;应避免匿名函数立即执行,改用命名函数调用,并警惕循环中闭包捕获变量陷阱。
快速定位goroutine泄漏需先用runtime.NumGoroutine()监控增长,再通过pprof/goroutine?debug=2查看阻塞在select{}、chanrecv或sync.WaitGroup.Wait的栈;常见原因包括漏调wg.Done()、向已关闭channel发送、fo...
goroutine和channel是Go并发的唯二基石,其他并发控制工具均围绕它们补足短板;新手需先写出可运行、不panic、结果可预期的最小并发程序。
sync.Mutex不能保护goroutine创建时的竞态,因为锁只作用于加锁到解锁间的代码,而go语句启动的新goroutine执行时机异步,主goroutine释放锁后其内部逻辑可能尚未执行。
用context.WithTimeout包裹goroutine是最可靠的方式:需在启动前创建带超时的ctx并传入,任务中定期检查ctx.Err()或用select等待ctx.Done(),且所有阻塞操作(如HTTP请求、time.Sleep、channel收发)都须配合ctx。
会,多个goroutine直接写同一*os.File会导致数据错乱或覆盖;虽底层write(2)对小数据原子,但实际中存在写入顺序不确定、Seek-Write竞态、“半行日志”等问题。
Go网络并发优化核心是高效利用goroutine、channel与I/O模型,重在减少阻塞与竞争:善用http.Server内置协程、context超时控制、缓冲区复用、sync.Pool对象池及原子操作或分片map降低锁争用。
context.WithTimeout本质是让任务主动退出而非外部杀协程,需在外层统一控制整个任务链超时,并将ctx传入所有阻塞函数且定期检查ctx.Done()。
原生map并发读写会panic,因扩容时无锁保护;sync.Map适用于读多写少场景;自封装RWMutex+map更可控;高竞争时可考虑分片map。
