golang异步闭包和回调管理工具插件库gollback的使用
Golang异步闭包和回调管理工具插件库gollback的使用
关于gollback
gollback是一个Go语言的异步简单函数工具库,用于管理闭包和回调的执行。
主要功能
Race方法
Race方法会在可迭代回调中任意一个回调返回非错误值时立即返回响应,否则返回最后一个错误。
package main
import (
"context"
"errors"
"fmt"
"time"
"github.com/vardius/gollback"
)
func main() {
r, err := gollback.Race(
context.Background(),
func(ctx context.Context) (interface{}, error) {
time.Sleep(3 * time.Second)
return 1, nil
},
func(ctx context.Context) (interface{}, error) {
return nil, errors.New("failed")
},
func(ctx context.Context) (interface{}, error) {
return 3, nil
},
)
}
All方法
All方法会等待所有回调执行完成,返回的响应和错误会按照回调的顺序排序。
package main
import (
"context"
"errors"
"fmt"
"time"
"github.com/vardius/gollback"
)
func main() {
rs, errs := gollback.All(
context.Background(),
func(ctx context.Context) (interface{}, error) {
time.Sleep(3 * time.Second)
return 1, nil
},
func(ctx context.Context) (interface{}, error) {
return nil, errors.New("failed")
},
func(ctx context.Context) (interface{}, error) {
return 3, nil
},
)
}
Retry方法
Retry方法会重试回调指定的次数,直到执行没有错误为止。当retries=0时会无限重试。
package main
import (
"context"
"errors"
"fmt"
"time"
"github.com/vardius/gollback"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// 将无限重试直到上下文超时(5秒后)
res, err := gollback.Retry(ctx, 0, func(ctx context.Context) (interface{}, error) {
return nil, errors.New("failed")
})
// 将重试5次或上下文超时(5秒后)
res, err := gollback.Retry(ctx, 5, func(ctx context.Context) (interface{}, error) {
return nil, errors.New("failed")
})
}
性能基准测试
➜ gollback git:(master) ✗ go test -bench=. -cpu=4 -benchmem
goos: darwin
goarch: amd64
pkg: github.com/vardius/gollback
BenchmarkRace-4 566022 2608 ns/op 663 B/op 5 allocs/op
BenchmarkAll-4 5052489 241 ns/op 42 B/op 1 allocs/op
BenchmarkRetry-4 206430384 5.93 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/vardius/gollback 31.741s
许可证
本包采用MIT许可证发布。
更多关于golang异步闭包和回调管理工具插件库gollback的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang异步闭包和回调管理工具插件库gollback的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Gollback: Go异步闭包与回调管理工具库详解
Gollback是一个轻量级的Go语言库,专门用于管理异步闭包和回调操作。它提供了一种简洁的方式来处理并发任务、超时控制和错误处理。
核心功能
- 异步执行闭包函数
- 超时控制
- 错误处理
- 结果收集
安装
go get github.com/vardius/gollback
基本使用示例
1. 简单异步执行
package main
import (
"context"
"fmt"
"time"
"github.com/vardius/gollback"
)
func main() {
ctx := context.Background()
// 异步执行单个闭包
res, err := gollback.Race(ctx, func(ctx context.Context) (interface{}, error) {
time.Sleep(100 * time.Millisecond)
return "result from async function", nil
})
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Result:", res)
}
2. 超时控制
func withTimeoutExample() {
ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
defer cancel()
res, err := gollback.Race(ctx, func(ctx context.Context) (interface{}, error) {
time.Sleep(100 * time.Millisecond) // 这个会超时
return "this won't be returned", nil
})
if err != nil {
fmt.Println("Error:", err) // 会输出context deadline exceeded
return
}
fmt.Println("Result:", res)
}
3. 并行执行多个任务
func parallelExecution() {
ctx := context.Background()
results, err := gollback.All(
ctx,
gollback.Async(func(ctx context.Context) (interface{}, error) {
time.Sleep(100 * time.Millisecond)
return 1, nil
}),
gollback.Async(func(ctx context.Context) (interface{}, error) {
time.Sleep(200 * time.Millisecond)
return 2, nil
}),
gollback.Async(func(ctx context.Context) (interface{}, error) {
time.Sleep(50 * time.Millisecond)
return 3, nil
}),
)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Results:", results) // 输出: [1 2 3]
}
4. 竞速执行(第一个完成的任务返回)
func raceExample() {
ctx := context.Background()
res, err := gollback.Race(
ctx,
gollback.Async(func(ctx context.Context) (interface{}, error) {
time.Sleep(200 * time.Millisecond)
return "slow", nil
}),
gollback.Async(func(ctx context.Context) (interface{}, error) {
time.Sleep(100 * time.Millisecond)
return "fast", nil
}),
)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Winner:", res) // 输出: fast
}
5. 重试机制
func retryExample() {
ctx := context.Background()
retryCount := 3
var attempt int
res, err := gollback.Retry(ctx, retryCount, func(ctx context.Context) (interface{}, error) {
attempt++
if attempt < retryCount {
return nil, fmt.Errorf("attempt %d failed", attempt)
}
return "success on attempt " + strconv.Itoa(attempt), nil
})
if err != nil {
fmt.Println("Final error:", err)
return
}
fmt.Println("Result:", res) // 输出: success on attempt 3
}
高级用法
自定义超时和取消
func advancedTimeout() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// 在另一个goroutine中取消操作
go func() {
time.Sleep(50 * time.Millisecond)
cancel()
}()
res, err := gollback.Race(ctx, func(ctx context.Context) (interface{}, error) {
select {
case <-time.After(100 * time.Millisecond):
return "completed", nil
case <-ctx.Done():
return nil, ctx.Err()
}
})
if err != nil {
fmt.Println("Operation canceled:", err)
return
}
fmt.Println("Result:", res)
}
组合使用
func combinedExample() {
ctx := context.Background()
// 并行执行3个任务,每个任务有重试机制
results, err := gollback.All(
ctx,
gollback.AsyncWithRetry(2, func(ctx context.Context) (interface{}, error) {
// 模拟有时失败的任务
if time.Now().UnixNano()%2 == 0 {
return nil, fmt.Errorf("random error")
}
return "task1", nil
}),
gollback.Async(func(ctx context.Context) (interface{}, error) {
return "task2", nil
}),
gollback.AsyncWithRetry(1, func(ctx context.Context) (interface{}, error) {
return "task3", nil
}),
)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("All results:", results)
}
最佳实践
- 始终传递context:确保能够控制goroutine的生命周期
- 合理设置超时:避免goroutine泄漏
- 错误处理:检查所有返回的错误
- 资源清理:使用defer或context取消来释放资源
- 限制并发:对于大量任务,考虑使用worker pool模式
Gollback是一个简单但功能强大的库,特别适合需要管理多个异步操作的场景。它的API设计简洁,与Go的标准库(特别是context包)良好集成,是处理并发回调的优秀工具。