github.com/go-board/x-go@v0.1.2-0.20220610024734-db1323f6cb15/concurrent/README.md (about) 1 # Concurrent 并发工具 2 3 ## Concurrent 并发请求并等待的工具 4 ```go 5 type Concurrent struct {} 6 func NewConcurrent(ctx context.Context) (*Concurrent, context.Context) 7 // 安排一个异步任务并返回 8 func (c *Concurrent) SpawnContext(ctx context.Context, fn func(ctx context.Context) error) 9 // 安排一个异步任务并返回 10 func (c *Concurrent) Spawn(fn func() error) 11 // 安排一些任务并等待结果返回 12 func (c *Concurrent) SpawnAndWait(ctx context.Context, fns ...func(context.Context) error) error 13 // 等待任务的执行结束,和SpawnContext与Spawn结合使用 14 func (c *Concurrent) Wait(ctx context.Context) error 15 ``` 16 17 ## Pool 协程池 18 ```go 19 type Task struct { 20 ctx context.Context 21 cancel context.CancelFunc 22 23 fn func(ctx context.Context) error 24 done chan error 25 } 26 // 取消一个任务,目前仅限于任务还未进行调度之前 27 func (t *Task) Cancel() 28 // 同步等待一个任务的完成 29 func (t *Task) Wait() error 30 // 带有超时的等待一个任务的完成 31 func (t *Task) WaitTimeout(timeout time.Duration) error 32 type Pool struct { 33 // TODO: 使用无锁数据结构来提高性能 34 taskCh chan *Task 35 workerNum int 36 done chan struct{} 37 } 38 // 创建一个协程池,worker数量为workerNum,任务队列大小为taskNum 39 func NewPool(workerNum int, taskNum int) *Pool 40 // 当前任务队列大小 41 func (p *Pool) JobQueueSize() int 42 // 调度一个任务并返回任务的token,用来进行控制 43 func (p *Pool) Spawn(ctx context.Context, fn func(ctx context.Context) error) *Task 44 // 关闭协程池 45 func (p *Pool) Shutdown() 46 ``` 47 ## Semaphore 信号量,并发量 48 ```go 49 type Semaphore struct {...} 50 // 创建一个并发度为n的信号量 51 func NewSemaphore(n int64) *Semaphore 52 // 获取token,并执行,如果没有可用的token,会等待 53 func (s *Semaphore) SpawnContext(ctx context.Context, fn func(ctx context.Context) error) error 54 // 获取token,并执行,如果没有可用的token,会等待 55 func (s *Semaphore) Spawn(fn func() error) error 56 // 获取token,并执行,如果没有可用的token,会立即返回 57 func (s *Semaphore) TrySpawnContext(ctx context.Context, fn func(ctx context.Context) error) error 58 // 获取token,并执行,如果没有可用的token,会立即返回 59 func (s *Semaphore) TrySpawn(fn func() error) error 60 ```