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

go 上下文:context.Context

這篇具有很好參考價(jià)值的文章主要介紹了go 上下文:context.Context。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Go語(yǔ)言中的上下文(Context)是一種用于在 Goroutines 之間傳遞取消信號(hào)、截止時(shí)間和其他請(qǐng)求范圍值的標(biāo)準(zhǔn)方式。context 包提供了 Context 類(lèi)型和一些相關(guān)的函數(shù),用于在并發(fā)程序中有效地傳遞上下文信息。

在Go語(yǔ)言中,上下文通常用于以下場(chǎng)景:

  1. 請(qǐng)求的傳遞:當(dāng)一個(gè)請(qǐng)求從客戶端發(fā)送到服務(wù)器時(shí),可以使用上下文來(lái)攜帶與該請(qǐng)求相關(guān)的數(shù)據(jù)。這些數(shù)據(jù)可以是用戶的身份信息、請(qǐng)求的元數(shù)據(jù)或其他與請(qǐng)求相關(guān)的信息。通過(guò)將上下文傳遞給處理該請(qǐng)求的goroutine,可以確保在整個(gè)處理過(guò)程中訪問(wèn)這些數(shù)據(jù)。
  2. 取消操作:上下文可以用于取消正在進(jìn)行的操作。當(dāng)用戶或其他代碼發(fā)送取消信號(hào)時(shí),可以將該信號(hào)傳遞給正在執(zhí)行操作的goroutine。goroutine在接收到取消信號(hào)后,可以根據(jù)需要執(zhí)行清理操作并退出。
  3. 截止時(shí)間:有時(shí)候需要在一段時(shí)間后終止正在進(jìn)行的操作。通過(guò)將截止時(shí)間與上下文一起傳遞給goroutine,可以確保在超過(guò)截止時(shí)間后執(zhí)行適當(dāng)?shù)那謇聿僮鞑⑼顺觥?/li>
  4. 跨多個(gè)服務(wù)通信:當(dāng)在分布式系統(tǒng)中使用Go語(yǔ)言時(shí),上下文可以用于跨不同的服務(wù)之間傳遞請(qǐng)求數(shù)據(jù)、取消信號(hào)和截止時(shí)間。通過(guò)使用上下文,可以確保在整個(gè)系統(tǒng)中的各個(gè)服務(wù)之間保持一致的上下文和請(qǐng)求生命周期管理。

通過(guò)使用上下文,可以有效地在 Goroutines 之間傳遞取消信號(hào)、截止時(shí)間和請(qǐng)求范圍的值,從而更好地控制并發(fā)程序的行為。

1. context.Context 接口

Context 接口定義了在 Goroutines 之間傳遞的上下文的基本方法:

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key interface{}) interface{}
}
  • Deadline():返回上下文的截止時(shí)間。如果存在截止時(shí)間,oktrue,否則為 false。
  • Done():返回一個(gè)通道,該通道關(guān)閉時(shí)表示上下文被取消或者超過(guò)了截止時(shí)間。
  • Err():返回上下文取消的原因。如果上下文沒(méi)有被取消,則返回 nil
  • Value(key):返回與給定 key 關(guān)聯(lián)的值。這允許在上下文中傳遞請(qǐng)求范圍的數(shù)據(jù)。

2. 創(chuàng)建上下文

在 Go 中,上下文可以通過(guò) context.Background() 創(chuàng)建,它是一個(gè)無(wú)值的上下文,通常用作根上下文。根上下文不能被取消,也不能傳遞截止時(shí)間。

ctx := context.Background()

可以使用 context.WithCancel、context.WithTimeout、context.WithDeadlinecontext.WithValue 等函數(shù)創(chuàng)建派生上下文,這些函數(shù)分別用于創(chuàng)建帶有取消、超時(shí)、截止時(shí)間和值的上下文。

// 創(chuàng)建一個(gè)帶有取消功能的上下文
ctx, cancel := context.WithCancel(context.Background())

// 創(chuàng)建一個(gè)帶有超時(shí)的上下文
ctx, cancel := context.WithTimeout(context.Background(), time.Second)

// 創(chuàng)建一個(gè)帶有截止時(shí)間的上下文
deadline := time.Now().Add(2 * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), deadline)

// 創(chuàng)建一個(gè)帶有值的上下文
key := "key"
value := "value"
ctx := context.WithValue(context.Background(), key, value)

3. 傳遞上下文

在 Go 中,通過(guò)函數(shù)參數(shù)將上下文傳遞給調(diào)用的函數(shù),從而使調(diào)用的函數(shù)能夠感知上下文的取消或超時(shí)。例如:

func myFunction(ctx context.Context) {
    // 在這里使用 ctx 處理邏輯
    select {
    case <-ctx.Done():
        // 上下文被取消,執(zhí)行清理工作
        fmt.Println("Context canceled")
        return
    default:
        // 繼續(xù)正常的邏輯
        fmt.Println("Doing some work")
    }
}

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

    // 啟動(dòng) Goroutine,傳遞上下文
    go myFunction(ctx)

    // 主 Goroutine 執(zhí)行一些工作
    time.Sleep(2 * time.Second)
}

4. 上下文的取消

調(diào)用 cancel() 函數(shù)會(huì)取消與上下文相關(guān)的 Goroutines。一旦上下文被取消,與之關(guān)聯(lián)的所有 Goroutines 都會(huì)收到取消信號(hào)。

ctx, cancel := context.WithCancel(context.Background())

// 啟動(dòng) Goroutine,傳遞上下文
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // 上下文被取消,執(zhí)行清理工作
        fmt.Println("Context canceled")
        return
    }
}(ctx)

// 取消上下文
cancel()

5. 上下文的超時(shí)和截止時(shí)間

使用 context.WithTimeoutcontext.WithDeadline 函數(shù)可以設(shè)置上下文的超時(shí)或截止時(shí)間。當(dāng)超過(guò)指定的時(shí)間后,上下文會(huì)自動(dòng)取消。

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

// 啟動(dòng) Goroutine,傳遞上下文
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // 上下文超時(shí),執(zhí)行清理工作
        fmt.Println("Context timeout")
        return
    }
}(ctx)

// 主 Goroutine 執(zhí)行一些工作
time.Sleep(3 * time.Second)

6. 上下文值

context.WithValue 函數(shù)可以用于在上下文中傳遞請(qǐng)求范圍的值。這些值可以通過(guò) context.Value 方法在上下文中檢索。

ctx := context.WithValue(context.Background(), "user", "john_doe")

// 從上下文中獲取值
value := ctx.Value("user")
fmt.Println(value) // 輸出: john_doe

7. 上下文的鏈?zhǔn)秸{(diào)用

可以通過(guò)鏈?zhǔn)秸{(diào)用的方式,將多個(gè)上下文進(jìn)行組合,形成一個(gè)父子關(guān)系的上下文鏈。

parentCtx := context.Background()
ctx1, cancel1 := context.WithTimeout(parentCtx, 2*time.Second)
defer cancel1()

ctx2, cancel2 := context.WithCancel(ctx1)
defer cancel2()

上述的 ctx2ctx1 的子上下文,當(dāng) ctx1 超時(shí)或被取消時(shí),ctx2 也會(huì)相應(yīng)地被取消。


go 上下文:context.Context

聲明:本作品采用署名-非商業(yè)性使用-相同方式共享 4.0 國(guó)際 (CC BY-NC-SA 4.0)進(jìn)行許可,使用時(shí)請(qǐng)注明出處。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無(wú)意文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-746288.html


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

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

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

相關(guān)文章

  • 什么是層疊上下文(stacking context)?它是如何形成的?

    什么是層疊上下文(stacking context)?它是如何形成的?

    前端入門(mén)之旅:探索Web開(kāi)發(fā)的奇妙世界 歡迎來(lái)到前端入門(mén)之旅!感興趣的可以訂閱本專(zhuān)欄哦!這個(gè)專(zhuān)欄是為那些對(duì)Web開(kāi)發(fā)感興趣、剛剛踏入前端領(lǐng)域的朋友們量身打造的。無(wú)論你是完全的新手還是有一些基礎(chǔ)的開(kāi)發(fā)者,這里都將為你提供一個(gè)系統(tǒng)而又親切的學(xué)習(xí)平臺(tái)。在這個(gè)

    2024年02月12日
    瀏覽(25)
  • HarmonyOS/OpenHarmony(Stage模型)卡片開(kāi)發(fā)應(yīng)用上下文Context使用場(chǎng)景二

    3.創(chuàng)建其他應(yīng)用或其他Module的Context 基類(lèi)Context提供創(chuàng)建其他應(yīng)用或其他Module的Context的方法為createModuleContext(moduleName:string),創(chuàng)建其他應(yīng)用或者其他Module的Context,從而通過(guò)該Context獲取相應(yīng)的資源信息(例如獲取其他Module的獲取應(yīng)用開(kāi)發(fā)路徑信息)。 調(diào)用createModuleContext(moduleNa

    2024年02月11日
    瀏覽(23)
  • HarmonyOS/OpenHarmony(Stage模型)卡片開(kāi)發(fā)應(yīng)用上下文Context使用場(chǎng)景一

    HarmonyOS/OpenHarmony(Stage模型)卡片開(kāi)發(fā)應(yīng)用上下文Context使用場(chǎng)景一

    1.獲取應(yīng)用文件路徑 基類(lèi)Context提供了獲取應(yīng)用文件路徑的能力,ApplicationContext、AbilityStageContext、UIAbilityContext和ExtensionContext均繼承該能力。應(yīng)用文件路徑屬于應(yīng)用沙箱路徑。上述各類(lèi)Context獲取的應(yīng)用文件路徑有所不同。 通過(guò)ApplicationContext獲取應(yīng)用級(jí)別的應(yīng)用文件路徑,此路

    2024年02月11日
    瀏覽(29)
  • React Native Ref轉(zhuǎn)發(fā)/Memo緩存/HOC高階組件/Context上下文

    React Native Ref轉(zhuǎn)發(fā)/Memo緩存/HOC高階組件/Context上下文

    1、使用自定義組件時(shí),實(shí)現(xiàn)外層組件對(duì)原始組件(TextInput)的操作 外層組件使用 ref 屬性 子組件使用 forwardRef 包裹 2、函數(shù)式組件對(duì)外暴露實(shí)例方法(cusomFocus) 子組件 父組件如圖一所示 1 、 避免多余渲染 問(wèn)題:每次點(diǎn)擊按鈕都會(huì)導(dǎo)致 InfoView 組件發(fā)生重繪,即使每次 setI

    2024年01月21日
    瀏覽(25)
  • [元帶你學(xué): eMMC協(xié)議 31] eMMC Context(上下文) ID 詳解 | eMMC 并行數(shù)據(jù)標(biāo)識(shí)與隔離詳解

    [元帶你學(xué): eMMC協(xié)議 31] eMMC Context(上下文) ID 詳解 | eMMC 并行數(shù)據(jù)標(biāo)識(shí)與隔離詳解

    依JEDEC eMMC及經(jīng)驗(yàn)辛苦整理,原創(chuàng)保護(hù),禁止轉(zhuǎn)載。 專(zhuān)欄 《元帶你學(xué):eMMC協(xié)議》 內(nèi)容摘要 全文 5000 字, 主要內(nèi)容 eMMC 為什么要引入 Context? Context 是什么? 如何使用Context 上下文? Context 上下文配置怎么做? 上下文 ID 應(yīng)用局限 系統(tǒng)層和芯片組對(duì) Context ID 支持情況 應(yīng)用層軟

    2024年02月11日
    瀏覽(96)
  • Yolov8漲點(diǎn)神器:注意力機(jī)制---多頭上下文集成(Context Aggregation)的廣義構(gòu)建模塊,助力小目標(biāo)檢測(cè),暴力漲點(diǎn)

    目錄 2.Context Aggregation介紹? 3. Yolov8引入ContextAggregation 3.1?修改modules.py中 3.2 注冊(cè)tasks.py模塊 3.3??yolov8_ContextAggregation.yam

    2024年02月06日
    瀏覽(23)
  • Yolov5漲點(diǎn)神器:注意力機(jī)制---多頭上下文集成(Context Aggregation)的廣義構(gòu)建模塊,助力小目標(biāo)檢測(cè),暴力漲點(diǎn)

    目錄 ?1.數(shù)據(jù)集性能驗(yàn)證 2.Context Aggregation介紹? 3. Yolov5引入ContextAggregation 3.1?修改common.py 3.2 注冊(cè)yolo.py模塊

    2024年02月07日
    瀏覽(75)
  • [go語(yǔ)言基礎(chǔ)]關(guān)于上下文機(jī)制

    關(guān)于什么為上下文機(jī)制 一般來(lái)說(shuō),我們?nèi)绻胍诙鄠€(gè)進(jìn)程中監(jiān)聽(tīng)彼此,最常用的方法就是使用管道進(jìn)行監(jiān)聽(tīng) 例如最常用的,想要在進(jìn)程之間傳遞某個(gè)進(jìn)程已經(jīng)完成的信號(hào),我們經(jīng)常使用通道的方式進(jìn)行傳遞消息. 舉個(gè)例子,一個(gè)進(jìn)程B想要監(jiān)聽(tīng)另一個(gè)進(jìn)程A,可以通過(guò)一個(gè)管道進(jìn)行監(jiān)

    2024年02月09日
    瀏覽(23)
  • 無(wú)限上下文,多級(jí)內(nèi)存管理!突破ChatGPT等大語(yǔ)言模型上下文限制

    無(wú)限上下文,多級(jí)內(nèi)存管理!突破ChatGPT等大語(yǔ)言模型上下文限制

    目前,ChatGPT、Llama 2、文心一言等主流大語(yǔ)言模型,因技術(shù)架構(gòu)的問(wèn)題上下文輸入一直受到限制,即便是Claude 最多只支持10萬(wàn)token輸入,這對(duì)于解讀上百頁(yè)報(bào)告、書(shū)籍、論文來(lái)說(shuō)非常不方便。 為了解決這一難題,加州伯克利分校受操作系統(tǒng)的內(nèi)存管理機(jī)制啟發(fā),提出了MemGPT。

    2024年02月06日
    瀏覽(26)
  • flask中的應(yīng)用上下文

    flask中的應(yīng)用上下文

    flask中的應(yīng)用上下文 Flask應(yīng)用上下文主要包含兩個(gè)對(duì)象: current_app 和 g 。這兩個(gè)對(duì)象在處理請(qǐng)求期間都是全局可訪問(wèn)的,但在每個(gè)請(qǐng)求結(jié)束時(shí)都會(huì)被重置。 current_app :這是當(dāng)前激活的Flask應(yīng)用的實(shí)例。在大多數(shù)情況下,你可以將其視為應(yīng)用的全局實(shí)例。然而,當(dāng)你在處理多個(gè)

    2024年02月14日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包