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