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语言库,专门用于管理异步闭包和回调操作。它提供了一种简洁的方式来处理并发任务、超时控制和错误处理。

核心功能

  1. 异步执行闭包函数
  2. 超时控制
  3. 错误处理
  4. 结果收集

安装

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)
}

最佳实践

  1. 始终传递context:确保能够控制goroutine的生命周期
  2. 合理设置超时:避免goroutine泄漏
  3. 错误处理:检查所有返回的错误
  4. 资源清理:使用defer或context取消来释放资源
  5. 限制并发:对于大量任务,考虑使用worker pool模式

Gollback是一个简单但功能强大的库,特别适合需要管理多个异步操作的场景。它的API设计简洁,与Go的标准库(特别是context包)良好集成,是处理并发回调的优秀工具。

回到顶部