Загрузка…
Загрузка…
Go · junior · сложность 4
Отмена и тайм-ауты в Go в основном обрабатываются с помощью пакета context. Тип context.Context переносит сроки, сигналы отмены и значения области запроса через границы API и между горутинами.
Роль context:
Context может быть отменен (вручную или из-за таймаута), и несколько горутин могут прослушивать этот сигнал отмены.
Функции, которые выполняют потенциально длительные операции или взаимодействуют с внешними службами, должны принимать context.Context в качестве первого аргумента.
Внутри горутины или функции вы проверяете ctx.Done() (канал, который закрывается при отмене контекста), чтобы знать, когда следует прекратить работу и вернуться раньше.
Пример (функция с тайм-аутом):
package main
import (
"context"
"fmt"
"time"
)
func performTask(ctx context.Context) error {
select {
case <-time.After(3 * time.Second):
// Task completed within the time
fmt.Println("Task finished")
return nil
case <-ctx.Done():
// Context was canceled (e.g., due to timeout or explicit cancellation)
fmt.Println("Task canceled:", ctx.Err())
return ctx.Err() // Return the context's error (context.DeadlineExceeded or context.Canceled)
}
}
func main() {
// Create a context with a 2-second timeout
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel() // Important: release resources associated with the context
err := performTask(ctx)
if err != nil {
fmt.Println("Error:", err)
}
// Output will be "Task canceled: context deadline exceeded" because the task takes 3s but the context times out after 2s.
}
```
## Итог
Отмена и тайм-ауты в Go в основном обрабатываются с помощью пакета `context`.