17網(wǎng)站一起做網(wǎng)店揭陽seo合作
開發(fā)人員有時會誤解context.Context類型,盡管它是Go語言的關(guān)鍵概念之一,也是Go中并發(fā)代碼的基礎(chǔ)之一。接下來讓我們看看這個概念,并確保我們理解為什么乃如何有效地使用它。
根據(jù)官方文檔:
上下文(context)攜帶最后期限、取消信號和其他跨API邊界的值。
下面讓我們來看下這個定義,以及和上下文相關(guān)的概念。
1. 最后期限
最后期限(deadline)是指通過以下方式明確指定的時間點:
- 從當前開始的一個time.Duration
- 一個time.Time
最后期限的語義傳達了如果到達此時間點則應(yīng)停止當前的活動。例如,活動可以是一個I/O請求或者是一個等待從channel接收消息的goroutine。
讓我們考慮一個應(yīng)用程序,它每4秒就從雷達那里接收一次飛行位置。一旦收到一個位置,我們希望能與其他關(guān)心最新位置的應(yīng)用程序共享它。我們在我們所掌握的邏輯中定義了一個publisher接口,它只包含一個方法:
type publisher interface {Publish(ctx context.Context, position flight.Position) error
}
這個方法接收一個上下文參數(shù)和一個位置參數(shù)。我們假定這個具體的實現(xiàn)會調(diào)用一個函數(shù)來給代理(broker,就像使用Sarama庫發(fā)布Kafka消息一樣)發(fā)布消息。這個函數(shù)是上下文敏感的(context aware),也就是說,一旦上下文被取消,它就可以取消請求。
假定我們沒有收到上游的上下文,那應(yīng)該提供給Publish方法什么上下文呢?我們提到過,應(yīng)用程序只對最新的位置感興趣,所以我們自已構(gòu)建的上下文應(yīng)該傳達4秒超時的信息,如果4秒后還沒有發(fā)布新的飛行位置,那就應(yīng)該停止調(diào)用Publish方法:
type publishHandler struct {pub publisher
}func (h publishHandler) publishPosition(position flight.Position) error {ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second)defer cancel()return h.pub.Publish(ctx, position)
}
這段代碼使用context.WithTimeout函數(shù)創(chuàng)建了一個上下文對象,它接收一個超時參數(shù)和一個上下文參數(shù),因為publishPosition沒有接收一個已存在的上下文,所以我們使用cont