Как 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
.