Documentation
¶
Overview ¶
Package goroutine 提供了用于获取和操作 Go 协程相关信息的工具函数。
主要特性:
- 获取当前 goroutine 的 ID
- 支持多个 Go 版本(1.5-1.24)
- 提供不同 CPU 架构的实现(amd64、arm64)
- 支持性能优化的实现方式
- 提供回退实现方案
- 线程安全
基本功能:
1. 获取 Goroutine ID:
// 获取当前 goroutine 的 ID
goid := goroutine.GetGoID()
fmt.Printf("当前 goroutine ID: %d\n", goid)
// 在并发环境中使用
go func() {
goid := goroutine.GetGoID()
fmt.Printf("新 goroutine ID: %d\n", goid)
}()
2. 性能优化版本:
// 使用优化的方式获取 goroutine ID
goid := goroutine.GetGoIDFast()
// 如果优化版本不可用,会自动回退到标准实现
if goid == -1 {
goid = goroutine.GetGoID()
}
实现说明:
1. 版本支持:
- Go 1.5:基础实现
- Go 1.6-1.8:改进的运行时支持
- Go 1.9-1.22:优化的实现
- Go 1.23+:最新的优化实现
2. 架构支持:
- AMD64:完整优化支持
- ARM64:完整优化支持
- 其他架构:基础实现支持
3. 实现方式:
- 直接访问运行时数据结构
- 使用汇编优化关键路径
- 提供回退实现保证可用性
性能考虑:
1. 快速路径:
- 优化的汇编实现
- 最小化指令数
- 避免运行时调用
2. 回退路径:
- 稳定可靠的实现
- 适用所有平台
- 性能略低但更通用
3. 缓存策略:
- 合理使用 CPU 缓存
- 避免不必要的内存访问
- 减少锁竞争
使用建议:
1. 版本选择:
- 优先使用 GetGoIDFast
- 必要时回退到 GetGoID
- 注意版本兼容性
2. 错误处理:
- 处理无效返回值(-1)
- 提供合理的回退方案
- 记录异常情况
3. 性能优化:
- 避免频繁调用
- 合理缓存结果
- 注意调用开销
限制和注意事项:
1. 兼容性:
- 不同 Go 版本行为可能不同
- 某些平台可能不支持优化实现
- 需要适当的回退策略
2. 安全性:
- 直接访问运行时数据结构
- 可能受到运行时更改影响
- 建议在开发环境充分测试
3. 调试:
- 提供详细的错误信息
- 支持运行时诊断
- 便于问题排查
最佳实践:
1. 开发环境:
- 使用最新的 Go 版本
- 进行充分的测试
- 验证所有目标平台
2. 生产环境:
- 进行性能基准测试
- 监控异常情况
- 提供降级方案
3. 代码维护:
- 保持实现的简洁性
- 提供清晰的文档
- 及时更新兼容性信息
更多示例和最佳实践请参考 example/runtime/goroutine 目录。
Index ¶
- Variables
- func GetGoID() int64
- func GetGoIDSlow() int64
- func Offset() int64
- func Submit(task func()) error
- type GoroutinePool
- type Option
- func WithExpiry(expiry time.Duration) Option
- func WithMaxBlocking(maxBlocking int) Option
- func WithMetrics(metrics bool) Option
- func WithName(name string) Option
- func WithNonBlocking(nonBlocking bool) Option
- func WithPanicHandler(panicHandler func(interface{})) Option
- func WithPreAlloc(preAlloc bool) Option
- func WithSize(size int) Option
Constants ¶
This section is empty.
Variables ¶
var ( // MetricWorkerCurrent 用于记录协程池的当前状态指标。 // 该指标包含以下标签: // - name: 协程池的名称。 // - state: 协程池的状态,包括容量、运行中、空闲和等待中的协程数量。 MetricWorkerCurrent = prometheus.NewGaugeVec(prometheus.GaugeOpts{ Namespace: namespace, Subsystem: subsystem, Name: "current", Help: "goroutine pool's worker current.", }, []string{"name", "state"}) )
Functions ¶
func GetGoID ¶
func GetGoID() int64
GetGoID 获取当前协程的 ID。 此函数在 amd64 架构下使用汇编实现,以获取更高效的性能。
已废弃:请考虑使用其他替代方法获取协程 ID。
返回值:
- int64:返回当前协程的 ID。
func GetGoIDSlow ¶
func GetGoIDSlow() int64
GetGoIDSlow 获取当前协程的 ID,当无法从 GetGoID 获取协程 ID 时使用此方法。 该方法通过获取协程的堆栈信息,然后解析堆栈信息来提取协程 ID。
返回值:
- int64:返回当前协程的 ID。
Types ¶
type GoroutinePool ¶ added in v0.0.10
type GoroutinePool interface {
// Submit 提交一个任务到协程池中执行。
// 参数:
// - task:要执行的任务函数。
//
// 返回值:
// - error:如果提交失败则返回错误。
Submit(task func()) error
// Tune 调整协程池的大小。
// 参数:
// - size:新的协程池大小。
Tune(size int)
// Cap 获取协程池的容量大小。
// 返回值:
// - int:协程池的容量。
Cap() int
// Running 获取协程池中正在运行的协程数量。
// 返回值:
// - int:正在运行的协程数量。
Running() int
// Free 获取协程池中空闲的协程数量。
// 返回值:
// - int:空闲的协程数量。
Free() int
// Waiting 获取协程池中等待执行的任务数量。
// 返回值:
// - int:等待执行的任务数量。
Waiting() int
// IsClosed 检查协程池是否已经关闭。
// 返回值:
// - bool:如果协程池已关闭则返回 true。
IsClosed() bool
}
GoroutinePool 定义了协程池的接口。 该接口提供了协程池的基本操作,包括任务提交、容量调整和状态查询等功能。
func NewGoroutinePool ¶ added in v0.0.10
func NewGoroutinePool(opts ...Option) (GoroutinePool, func(), error)
NewGoroutinePool 创建一个新的协程池实例。 参数:
- opts:配置选项。
返回值:
- GoroutinePool:新的协程池实例。
- func():清理函数,用于释放协程池资源。
- error:如果创建失败则返回错误。
type Option ¶ added in v0.0.10
type Option func(p *goroutinePool)
Option 定义了协程池的配置选项类型。
func WithExpiry ¶ added in v0.0.10
WithExpiry 设置协程池中协程的过期时间。 参数:
- expiry:协程的过期时间。
返回值:
- Option:配置选项函数。
func WithMaxBlocking ¶ added in v0.0.10
WithMaxBlocking 设置最大阻塞数量。 参数:
- maxBlocking:最大阻塞数量。
返回值:
- Option:配置选项函数。
func WithMetrics ¶ added in v0.0.10
WithMetrics 设置是否提供指标信息。 参数:
- metrics:是否提供指标信息。
返回值:
- Option:配置选项函数。
func WithNonBlocking ¶ added in v0.0.10
WithNonBlocking 设置是否使用非阻塞模式。 参数:
- nonBlocking:是否使用非阻塞模式。
返回值:
- Option:配置选项函数。
func WithPanicHandler ¶ added in v0.0.10
func WithPanicHandler(panicHandler func(interface{})) Option
WithPanicHandler 设置协程 panic 时的处理函数。 参数:
- panicHandler:panic 处理函数。
返回值:
- Option:配置选项函数。
func WithPreAlloc ¶ added in v0.0.10
WithPreAlloc 设置是否在初始化时预创建协程。 参数:
- preAlloc:是否预创建协程。
返回值:
- Option:配置选项函数。