TGViewer
Go tests Go tests @golangtests · 7.84K subscribers
Post #936 762
👣 Задача на Go 1.27: concurrent job scheduler с generic methods

Нужно реализовать библиотеку scheduler, которая запускает задачи параллельно, ограничивает concurrency, поддерживает context.Context, retry, timeout и возвращает типизированные результаты.

💡 Требования

Создайте generic-тип:


type Scheduler[T any] struct {
// ...
}

Он должен поддерживать регистрацию задач:

type Job[T any] func(ctx context.Context) (T, error)

И новый generic method Go 1.27:

func (s *Scheduler[T]) Map[R any](
ctx context.Context,
fn func(context.Context, T) (R, error),
) ([]R, error)
Функциональность

Scheduler должен уметь:

выполнять не более N задач одновременно;
отменять все оставшиеся задачи при отмене context.Context;
задавать timeout для каждой задачи;
делать до K retry с exponential backoff;
сохранять исходный порядок результатов;
не иметь data race;
корректно завершать goroutines без утечек;
возвращать ошибку с информацией, какая задача упала.

Пример API:

```go
s := scheduler.New[int](
scheduler.WithWorkers(8),
scheduler.WithRetries(3),
scheduler.WithTimeout(2*time.Second),
)

for i := range 100 {
n := i

s.Add(func(ctx context.Context) (int, error) {
return expensiveOperation(ctx, n)
})
}

values, err := s.Run(ctx)

strings, err := s.Map(ctx, func(
ctx context.Context,
value int,
) (string, error) {
return strconv.Itoa(value), nil
})


Ограничения

• Нельзя использовать сторонние worker-pool библиотеки.
• Можно использовать только standard library.
• Нельзя запускать goroutine на каждую задачу без ограничения.
• Нельзя игнорировать ctx.Done().

Решение должно проходить:

go test ./...
go test -race ./...
go vet ./...
Дополнительный уровень


Добавьте:


func (s *Scheduler[T]) Stream(
ctx context.Context,
) <-chan Result[T]


где результаты приходят сразу после завершения задач, а не после окончания всего batch.

Ещё сложнее:


priority queue;
dynamic worker count;
graceful shutdown;
metrics через expvar;
retry только для определённых типов ошибок;
panic recovery внутри job;
benchmark;
fuzz tests.


Главный вопрос

Как реализовать Scheduler так, чтобы одновременно обеспечить:

bounded concurrency + cancellation + ordering + retries + no goroutine leaks + no races
  • ❤ 3
  • 🥰 1
More from @golangtests
  1. Sep 13, 2026🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку Можно годами смотреть…
  2. Sep 2, 2026👣 Go 1.27: почему две разные closure внезапно могут иметь одинаковый адрес функции? Что в…
  3. Aug 21, 2026Go-задача: что выведет этот код? package main import "fmt" func main() { var funcs []func(…
  4. Aug 6, 2026Задача Go 1.26, на которой легко ошибиться даже опытному разработчику Что выведет этот код…
  5. Jul 27, 2026🧠 Редкая задача для Go-разработчиков Версия: Go 1.23+ Именно в Go 1.23 появился range по…
  6. Jul 18, 2026В Go 1.26 появился типобезопасный errors.AsType, который ищет ошибку нужного типа внутри д…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →