Ants
high-performance and low-cost goroutine pool
使用Golang编写的低成本高性能的goroutine池
池子类型
- Pool
- PoolWithFunc
- MultiPool
- MultiPoolWithFunc
源码偶得自旋锁🔗
1 | // Copyright 2019 Andy Pan & Dietoad. All rights reserved. |
两个关键点
- 指数避让
1 | if backoff < maxBackoff { |
runtime.Gosched
runtime.Gosched() 是一个用于让出当前 goroutine 的调度器,以便让其他 goroutine 运行的函数。它不会明确指定让出 CPU 的时间,而是将当前 goroutine 放回到调度队列中,允许 Go 调度器选择运行其他可运行的 goroutine。实际上,它让出的是调度机会,而不是具体的时间片。
- 让出调度:当前 goroutine 将自己放回到调度队列中,并且可能会立即被重新调度运行,或者在其他 goroutine 运行之后再被调度运行。
- 不阻塞:runtime.Gosched() 不会阻塞当前 goroutine,而是让出调度之后继续执行。
扩展
time.Sleep 与 runtime.Gosched 的对比
- time.Sleep:
- 让出 CPU 时间片并进入睡眠状态,直到指定的时间结束。
- 睡眠时间可以非常短(如 time.Nanosecond),也可以比较长。
- 在睡眠期间,该 goroutine 不会被调度运行。
- runtime.Gosched:
- 立即让出当前 goroutine 的调度权,但没有指定具体的时间。
- 当前 goroutine 会被放回调度队列,调度器可以立即或者稍后重新调度该 goroutine。