По всем вопросам- @haarrp
@itchannels_telegram - 🔥полезные ит-каналы
https://t.me/Golang_google - Golang программирование
@golangl - golang chat
@GolangJobsit - golang channel jobs
@golang_jobsgo - go chat jobs
Post #936
750
👣 Задача на Go 1.27: concurrent job scheduler с generic methods
Нужно реализовать библиотеку
💡 Требования
Создайте generic-тип:
Ограничения
• Нельзя использовать сторонние worker-pool библиотеки.
• Можно использовать только standard library.
• Нельзя запускать goroutine на каждую задачу без ограничения.
• Нельзя игнорировать ctx.Done().
Решение должно проходить:
Добавьте:
где результаты приходят сразу после завершения задач, а не после окончания всего batch.
Ещё сложнее:
Главный вопрос
Как реализовать Scheduler так, чтобы одновременно обеспечить:
bounded concurrency + cancellation + ordering + retries + no goroutine leaks + no races
Нужно реализовать библиотеку
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



