Что такое контекст Go | Месяц темы Go

Go
Что такое контекст Go | Месяц темы Go

Как Gopher, как вы можете не знать контекст Go? Приходите и узнайте!

вводить

Представлен в стандартной библиотеке Go 1.7.context, в переводе на китайский "контекст", если быть точным, этоgoroutineконтекст, в том числеgoroutineрабочее состояние, окружающая среда, сайт и другая информация.

contextв основном используется вgoroutineМежду ними передается контекстная информация, в том числе: сигнал отмены, тайм-аут, крайний срок, k-v и т. д.

вместе сcontextС введением пакета в стандартную библиотеку было добавлено множество интерфейсов.contextпараметры, такие какdatabase/sqlСумка.contextЭто почти стало стандартной практикой для управления параллелизмом и тайм-аутом.

сцены, которые будут использоваться

в ГоhttpупаковкаServer, каждому запросу соответствуетgoroutineиметь дело с. Обработчик запроса обычно запускает дополнительныйgoroutineИспользуется для доступа к серверным службам, таким как базы данных иRPCСлужить. используется для обработки запросаgoroutineОбычно требуется доступ к некоторым данным, относящимся к запросу, таким как информация об аутентификации конечного пользователя, связанная с проверкойtoken, крайний срок для запроса. Когда запрос отменен или истекло время ожидания, всеgoroutineдолжен выйти быстро, прежде чем система сможет освободить этиgoroutineзанятые ресурсы.

Условия эксплуатации

  • Не надоContextвместо этого в структуруContextдолжен быть передан в качестве первого параметра с именемctx,Например:
func DoSomething (ctx context.Context,arg Arg) error {
    // use ctx
}
  • Не проходите, даже если функция позволяет этоnilизContext. Если вы не знаете, какой из них использоватьContext,можно использоватьcontext.TODO().

  • использоватьContextизValueСвязанные методы следует использовать только для связанных с запросом метаданных, передаваемых в программах и интерфейсах, и не использовать их для передачи некоторых необязательных параметров.

  • идентичныйContextможно передавать по разнымgoroutine,так какContextявляется безопасным параллелизмом.

Структура контекста

// A Context carries a deadline, cancelation signal, and request-scoped values
// across API boundaries. Its methods are safe for simultaneous use by multiple
// goroutines.
type Context interface {
    // Done returns a channel that is closed when this Context is canceled
    // or times out.
    Done() <-chan struct{}

    // Err indicates why this context was canceled, after the Done channel
    // is closed.
    Err() error

    // Deadline returns the time when this Context will be canceled, if any.
    Deadline() (deadline time.Time, ok bool)

    // Value returns the value associated with key or nil if none.
    Value(key interface{}) interface{}
}
  • Done()Вернуть канал. Когда истечет время ожидания или будет вызван метод отмены, он будет закрыт.
  • Err()возвращает ошибку. Почему контекст был отменен.
  • Deadline()Срок возврата и ок.
  • Value()возвращениеKeyценность.

методы пакета контекста

func Background() Context
func TODO() Context

func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val interface{}) Context
  • BackgroundиTODOоба возвращаются пустымиContext.
  • WithCancelс новымDone channelвозвращает родителяContextкопировать.
  • WithDeadlineСрок устанавливается не позднееdeadlineВозвращает копию родительского контекста.
  • WithTimeoutвозвращениеWithDeadline(parent, time.Now().Add(timeout)).
  • WithValueЗначение возвращенного родителя, связанного с ключом, находится вvalкопия.

Суммировать

весьcontextИсходный код пакета очень короткий, очень подходит для изучения, обязательно прочитайте. Помимо использованияcontextДля управления параллелизмом мы также можем использоватьWaitGroup.