diff --git a/lectures/06-http/context/cancelation/cancelation.go b/lectures/05-concurrency/context/cancelation/cancelation.go similarity index 100% rename from lectures/06-http/context/cancelation/cancelation.go rename to lectures/05-concurrency/context/cancelation/cancelation.go diff --git a/lectures/06-http/context/httpserver/handler.go b/lectures/05-concurrency/context/httpserver/handler.go similarity index 100% rename from lectures/06-http/context/httpserver/handler.go rename to lectures/05-concurrency/context/httpserver/handler.go diff --git a/lectures/06-http/context/httpserver/handler_test.go b/lectures/05-concurrency/context/httpserver/handler_test.go similarity index 100% rename from lectures/06-http/context/httpserver/handler_test.go rename to lectures/05-concurrency/context/httpserver/handler_test.go diff --git a/lectures/06-http/context/httpserver/httpserver.go b/lectures/05-concurrency/context/httpserver/httpserver.go similarity index 100% rename from lectures/06-http/context/httpserver/httpserver.go rename to lectures/05-concurrency/context/httpserver/httpserver.go diff --git a/lectures/05-concurrency/lecture.slide b/lectures/05-concurrency/lecture.slide index 9405a4a..d25740f 100644 --- a/lectures/05-concurrency/lecture.slide +++ b/lectures/05-concurrency/lecture.slide @@ -334,3 +334,77 @@ Concurrency with Shared Memory - errgroup - `sync.WaitGroup` в встроенной обработкой ошибок - semaphore - семафор - singleflight - дедубликация вызовов + +* context + + type Context interface { + // Возвращает время, когда операция будет оповещена о необходимости завершения + Deadline() (deadline time.Time, ok bool) + + // Возвращает канал, который будет закрыт при необходимости завершить операцию + // Служит в качестве инструмента оповещения об отмене + Done() <-chan struct{} + + // Если Done не закрыт - возвращает nil. + // Если Done закрыт, Err ошибку с объяснением причины: + // - Canceled - контекст был отменен + // - DeadlineExceeded - наступил дедлайн. + // После возврашения не nil ошибки Err всегда возвращает данную ошибку. + Err() error + + // Позволяет получить произвольный объект из контекста + Value(key interface{}) interface{} + } + +- Отмена таймауты +- Передача request scoped значений + +* context + +Типы контекстов: + + // root context + todo := context.TODO() + ctx := context.Background() + + // manual cancel + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + // cancel by timeout + ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) + defer cancel() + + ctx, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second)) + defer cancel() + +* Отменяем операции + +.code context/cancelation/cancelation.go /func SimpleCancelation()/,/OMIT/ +.code context/cancelation/cancelation.go /func doSlowJob/,/OMIT/ + +* Отменяем операции + +.code context/cancelation/cancelation.go /func SimpleTimeout()/,/OMIT/ +.code context/cancelation/cancelation.go /func doSlowJob/,/OMIT/ + +* context в библиотеках Go + +По соглашению `Context` всегда передается первым параметром в функции, обычно именуясь `ctx`. + + database/sql.(*DB).QueryContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) + database/sql.(*DB).ExecContext(ctx context.Context, query string, args ...interface{}) (Result, error) + net/http.NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error) + golang.org/x/sync/errgroup.WithContext(ctx context.Context) (*Group, context.Context) + ... + +Быстрый пример: + + ctx, cancel := context.WithTimeout(context.Background(), 1 * time.Second) + defer cancel() + + req, _ := http.NewRequestWithContext(ctx, "GET", "http://loremipsum.com", nil) + resp, err := http.DefaultClient.Do(req) + if err != nil { + // возможно тут будет DeadlineExceeded + } diff --git a/lectures/06-http/lecture.slide b/lectures/06-http/lecture.slide index 294d894..1c94c8b 100644 --- a/lectures/06-http/lecture.slide +++ b/lectures/06-http/lecture.slide @@ -1,4 +1,4 @@ -http и context +http Лекция 6 Фёдор Короткий @@ -125,80 +125,6 @@ http и context .play gracefulshutdown/gracefulshutdown.go /func run()/,/^}/ -* context - - type Context interface { - // Возвращает время, когда операция будет оповещена о необходимости завершения - Deadline() (deadline time.Time, ok bool) - - // Возвращает канал, который будет закрыт при необходимости завершить операцию - // Служит в качестве инструмента оповещения об отмене - Done() <-chan struct{} - - // Если Done не закрыт - возвращает nil. - // Если Done закрыт, Err ошибку с объяснением причины: - // - Canceled - контекст был отменен - // - DeadlineExceeded - наступил дедлайн. - // После возврашения не nil ошибки Err всегда возвращает данную ошибку. - Err() error - - // Позволяет получить произвольный объект из контекста - Value(key interface{}) interface{} - } - -- Отмена таймауты -- Передача request scoped значений - -* context - -Типы контекстов: - - // root context - todo := context.TODO() - ctx := context.Background() - - // manual cancel - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - // cancel by timeout - ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) - defer cancel() - - ctx, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second)) - defer cancel() - -* Отменяем операции - -.code context/cancelation/cancelation.go /func SimpleCancelation()/,/OMIT/ -.code context/cancelation/cancelation.go /func doSlowJob/,/OMIT/ - -* Отменяем операции - -.code context/cancelation/cancelation.go /func SimpleTimeout()/,/OMIT/ -.code context/cancelation/cancelation.go /func doSlowJob/,/OMIT/ - -* context в библиотеках Go - -По соглашению `Context` всегда передается первым параметром в функции, обычно именуясь `ctx`. - - database/sql.(*DB).QueryContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) - database/sql.(*DB).ExecContext(ctx context.Context, query string, args ...interface{}) (Result, error) - net/http.NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error) - golang.org/x/sync/errgroup.WithContext(ctx context.Context) (*Group, context.Context) - ... - -Быстрый пример: - - ctx, cancel := context.WithTimeout(context.Background(), 1 * time.Second) - defer cancel() - - req, _ := http.NewRequestWithContext(ctx, "GET", "http://loremipsum.com", nil) - resp, err := http.DefaultClient.Do(req) - if err != nil { - // возможно тут будет DeadlineExceeded - } - * Контекст в HTTP сервере .code context/httpserver/httpserver.go /type ReqTimeContextKey/,/^}/ @@ -244,4 +170,4 @@ http и context .link https://github.com/labstack/echo .link https://github.com/gin-gonic/gin -.link https://github.com/gofiber/fiber \ No newline at end of file +.link https://github.com/gofiber/fiber