国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

golang中context詳解

這篇具有很好參考價值的文章主要介紹了golang中context詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

編碼中遇到上下文信息傳遞,并發(fā)信息取消等,記錄下在go語言中context包的使用。


context 介紹

在Go語言中,context包提供了一種在程序中傳遞截止日期、取消信號、請求范圍數(shù)據(jù)和其他元數(shù)據(jù)的方式。context包的核心類型是Context接口,它定義了在執(zhí)行上下文中傳遞的方法。Context接口的主要方法包括Deadline、Done、Err、Value等。

關(guān)鍵概念和使用方式

  1. Background: context.Background()函數(shù)返回一個空的Context,通常作為整個應(yīng)用的頂層上下文,用于傳遞全局的信息。

  2. WithCancel: context.WithCancel函數(shù)創(chuàng)建一個帶有取消信號的Context。當(dāng)調(diào)用返回的cancel函數(shù)時,與該Context相關(guān)聯(lián)的所有操作都會被取消。

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel() // 在不再需要時調(diào)用cancel
    
  3. WithTimeout和WithDeadline: context.WithTimeoutcontext.WithDeadline函數(shù)創(chuàng)建帶有截止日期的ContextWithTimeout設(shè)置相對于當(dāng)前時間的截止日期,而WithDeadline設(shè)置絕對時間的截止日期。

    ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
    defer cancel() // 在不再需要時調(diào)用cancel
    
  4. WithValue: context.WithValue函數(shù)可以在Context中存儲鍵值對,用于傳遞請求范圍的數(shù)據(jù)。但要注意,過度使用WithValue可能導(dǎo)致上下文變得復(fù)雜,應(yīng)慎重使用。

    ctx := context.WithValue(context.Background(), key, value)
    
  5. Done和Err: Done通道會在上下文被取消或達(dá)到截止日期時關(guān)閉。Err方法返回取消的原因,通常是context.Canceledcontext.DeadlineExceeded。

    select {
    case <-ctx.Done():
        // 上下文被取消
        fmt.Println("Context canceled:", ctx.Err())
    }
    

context包的設(shè)計(jì)旨在簡化在不同部分之間傳遞截止日期、取消信號和請求范圍數(shù)據(jù)的方式,特別是在并發(fā)環(huán)境中。使用context包可以更好地管理資源、控制執(zhí)行時間和處理取消操作。

基礎(chǔ)使用

基礎(chǔ)的context包使用示例,演示如何創(chuàng)建上下文、設(shè)置截止日期、取消上下文等基本操作:

package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// 創(chuàng)建一個帶有取消信號的上下文
	ctx, cancel := context.WithCancel(context.Background())

	// 啟動一個goroutine執(zhí)行任務(wù),并傳入上下文
	go performTask(ctx)

	// 模擬等待用戶輸入或其他觸發(fā)條件
	fmt.Println("Press Enter to cancel the task.")
	fmt.Scanln()

	// 調(diào)用cancel函數(shù)取消上下文
	cancel()

	// 等待一段時間,以確保goroutine有足夠的時間處理取消操作
	time.Sleep(time.Second * 2)
}

func performTask(ctx context.Context) {
	// 使用select監(jiān)聽上下文的取消信號
	select {
	case <-ctx.Done():
		// 當(dāng)上下文被取消時執(zhí)行的操作
		fmt.Println("Task canceled:", ctx.Err())
	default:
		// 模擬一個長時間運(yùn)行的任務(wù)
		for i := 1; i <= 5; i++ {
			fmt.Println("Task is running...")
			time.Sleep(time.Second)
		}
		fmt.Println("Task completed successfully.")
	}
}

在這個示例中,我們首先創(chuàng)建一個帶有取消信號的上下文,然后啟動一個goroutine執(zhí)行performTask函數(shù)。用戶在控制臺輸入任意字符后,我們調(diào)用cancel函數(shù)取消上下文。performTask函數(shù)中使用select監(jiān)聽上下文的取消信號,一旦上下文被取消,任務(wù)將提前結(jié)束。在實(shí)際應(yīng)用中,可以根據(jù)需要設(shè)置截止日期、傳遞數(shù)據(jù)等,以更靈活地管理上下文。

進(jìn)階使用

進(jìn)階的復(fù)雜示例,演示如何使用context包處理多個并發(fā)任務(wù),并在某個任務(wù)失敗或超時時取消所有任務(wù):

package main

import (
	"context"
	"fmt"
	"math/rand"
	"sync"
	"time"
)

func main() {
	// 創(chuàng)建一個帶有取消信號的上下文,設(shè)置總體超時為5秒
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
	defer cancel()

	// 使用WaitGroup等待所有任務(wù)完成
	var wg sync.WaitGroup

	// 啟動多個goroutine執(zhí)行任務(wù)
	for i := 1; i <= 3; i++ {
		wg.Add(1)
		go performTask(ctx, i, &wg)
	}

	// 等待所有任務(wù)完成或上下文取消
	wg.Wait()

	fmt.Println("All tasks completed.")
}

func performTask(ctx context.Context, taskID int, wg *sync.WaitGroup) {
	defer wg.Done()

	// 模擬每個任務(wù)的執(zhí)行時間
	taskDuration := time.Second * time.Duration(rand.Intn(10))
	fmt.Printf("Task %d started. Duration: %s\n", taskID, taskDuration)

	// 使用WithTimeout創(chuàng)建一個子上下文,設(shè)置每個任務(wù)的超時時間
	subCtx, cancel := context.WithTimeout(ctx, taskDuration)
	defer cancel()

	select {
	case <-subCtx.Done():
		// 當(dāng)子上下文被取消時執(zhí)行的操作
		if subCtx.Err() == context.DeadlineExceeded {
			fmt.Printf("Task %d timed out.\n", taskID)
		} else {
			fmt.Printf("Task %d canceled.\n", taskID)
		}
	case <-time.After(taskDuration):
		// 模擬任務(wù)的實(shí)際工作
		fmt.Printf("Task %d completed successfully.\n", taskID)
	}
}

在這個示例中,我們創(chuàng)建了一個帶有總體超時的上下文,并啟動了多個goroutine執(zhí)行performTask函數(shù)。每個任務(wù)都有一個隨機(jī)的執(zhí)行時間,并在子上下文中設(shè)置了超時。使用select監(jiān)聽子上下文的取消信號,一旦有任務(wù)失敗或超時,它將及時結(jié)束。通過使用sync.WaitGroup等待所有任務(wù)完成,我們確保在所有任務(wù)完成或總體超時后程序可以退出。

這種方式可以更好地控制并發(fā)任務(wù),確保及時釋放資源并在需要時取消任務(wù)。在實(shí)際應(yīng)用中,可以根據(jù)具體需求調(diào)整超時時間和處理邏輯。文章來源地址http://www.zghlxwxcb.cn/news/detail-813033.html

到了這里,關(guān)于golang中context詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Golang 如何基于現(xiàn)有的 context 創(chuàng)建新的 context?

    目錄 基于現(xiàn)有的 context 創(chuàng)建新的 context 現(xiàn)有創(chuàng)建方法的問題 Go 1.21 中的 context.WithoutCancel 函數(shù) Go 版本低于 1.21 該怎么辦? 在 Golang 中,context 包提供了創(chuàng)建和管理上下文的功能。當(dāng)需要基于現(xiàn)有的 context.Context 創(chuàng)建新的 context 時,通常是為了添加額外的控制信息或?yàn)榱藵M足特

    2024年01月17日
    瀏覽(21)
  • 【Golang】VsCode下開發(fā)Go語言的環(huán)境配置(超詳細(xì)圖文詳解)

    【Golang】VsCode下開發(fā)Go語言的環(huán)境配置(超詳細(xì)圖文詳解)

    ??推薦網(wǎng)站(不斷完善中):個人博客 ??個人主頁:個人主頁 ??相關(guān)專欄:CSDN專欄、個人專欄 ??立志賺錢,干活想躺,瞎分享的摸魚工程師一枚 ? 話說在前,Go語言的編碼方式是 UTF-8 ,理論上你直接使用文本進(jìn)行編輯也是可以的,當(dāng)然為了提升我們的開發(fā)效率我們還是需

    2024年02月07日
    瀏覽(27)
  • Golang:淺析Context包

    在golang官方文檔context package - context - Go Packages中是這樣介紹context包的: 在context包中定義了context類型來在不同的Goroutine 之間傳遞上下文,攜帶截止時間、取消信號以及攜帶上下文的系統(tǒng)參數(shù)(k-v)的類型。對服務(wù)器的傳入請求應(yīng)該創(chuàng)建上下文,對服務(wù)器的傳出調(diào)用應(yīng)該接受上

    2024年02月06日
    瀏覽(19)
  • golang Context應(yīng)用舉例

    golang Context應(yīng)用舉例

    ? golang標(biāo)準(zhǔn)庫里Context實(shí)際上是一個接口(即一種編程規(guī)范、 一種約定)。 ? 通過查看源碼里的注釋,我們得到如下約定: Done()函數(shù)返回一個只讀管道,且管道里不存放任何元素(struct{}),所以用這個管道就是為了實(shí)現(xiàn)阻塞 Deadline()用來記錄到期時間,以及是否到期。 Err()用來

    2024年02月08日
    瀏覽(19)
  • golang之context實(shí)用記錄

    簡言 WithCancel()函數(shù)接受一個 Context 并返回其子Context和取消函數(shù)cancel 新創(chuàng)建協(xié)程中傳入子Context做參數(shù),且需監(jiān)控子Context的Done通道,若收到消息,則退出 需要新協(xié)程結(jié)束時,在外面調(diào)用 cancel 函數(shù),即會往子Context的Done通道發(fā)送消息 注意:當(dāng) 父Context的 Done() 關(guān)閉的時候,子

    2024年02月09日
    瀏覽(19)
  • 【golang】Context超時控制與原理

    【golang】Context超時控制與原理

    在Go語言圈子中流行著一句話: Never start a goroutine without knowing how it will stop。 翻譯:如果你不知道協(xié)程如何退出,就不要使用它。 在創(chuàng)建協(xié)程時,我們可能還會再創(chuàng)建一些別的子協(xié)程,那么這些協(xié)程的退出就成了問題。在Go1.7之后,Go官方引入了Context來實(shí)現(xiàn)協(xié)程的退出。不僅

    2024年01月22日
    瀏覽(19)
  • golang常用庫包:log日志記錄-uber的Go日志庫zap使用詳解

    Go 日志記錄庫:uber-go 的日志操作庫 zap 使用 zap 是 uber 開源的一個高性能,結(jié)構(gòu)化,分級記錄的日志記錄包。 go1.20.2 zap v1.24.0 高性能:zap 對日志輸出進(jìn)行了多項(xiàng)優(yōu)化以提高它的性能 日志分級:有 Debug,Info,Warn,Error,DPanic,Panic,F(xiàn)atal 等 日志記錄結(jié)構(gòu)化:日志內(nèi)容記錄是結(jié)

    2023年04月11日
    瀏覽(26)
  • golang 通過context設(shè)置接口請求超時時間

    下面是直接可應(yīng)用的實(shí)例:

    2024年02月10日
    瀏覽(17)
  • 【Golang】golang中http請求的context傳遞到異步任務(wù)的坑

    【Golang】golang中http請求的context傳遞到異步任務(wù)的坑

    在golang中,context.Context可以用來用來設(shè)置截止日期、同步信號,傳遞請求相關(guān)值的結(jié)構(gòu)體。 與 goroutine 有比較密切的關(guān)系。 在web程序中,每個Request都需要開啟一個goroutine做一些事情,這些goroutine又可能會開啟其他的 goroutine去訪問后端資源,比如數(shù)據(jù)庫、RPC服務(wù)等,它們需要訪

    2024年02月08日
    瀏覽(27)
  • go 上下文:context.Context

    go 上下文:context.Context

    Go語言中的上下文(Context)是一種用于在 Goroutines 之間傳遞取消信號、截止時間和其他請求范圍值的標(biāo)準(zhǔn)方式。 context 包提供了 Context 類型和一些相關(guān)的函數(shù),用于在并發(fā)程序中有效地傳遞上下文信息。 在Go語言中,上下文通常用于以下場景: 請求的傳遞:當(dāng)一個請求從客戶

    2024年02月05日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包