Search
Write a publication
Pull to refresh

Comments 1

Спасибо за статью.
Немного подушню :-) В воркерах я бы добавил проверку, что канал не был закрыт, и прокинул бы контекст дальше в целевую функцию (ну и обрабатывать отмену там тоже), а то в случае если контекст будет отменен после того, как мы провалились в функцию, воркер не закончит работу пока она не доработает.

func worker(ctx context.Context, jobs <-chan Job) {
    for {
        select {
        case job, ok := <-jobs:
            if !ok {
              return              
            }

            processJob(ctx, job)
        case <-ctx.Done():
            log.Println("Worker shutting down")
            return
        }
    }
}

func processJob(ctx context.Context , job Job) {
    ch := make(chan {}struct)
    go func() {
      // Вот тут что-нить тяжелое

      close(ch)
    }

    select {
      case <-ch:
        return
      case <-ctx.Done():
        return
    }
}
Sign up to leave a comment.

Articles