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  ```