亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

go語(yǔ)言中context的使用說(shuō)明

 更新時(shí)間:2024年12月20日 16:36:51   作者:編程磚家  
Go語(yǔ)言中的Context是用于在多個(gè)函數(shù)或goroutine之間傳遞取消信號(hào)、超時(shí)控制、截止時(shí)間和請(qǐng)求范圍數(shù)據(jù)的重要概念,它提供了更好的控制和管理,適用于并發(fā)編程中需要傳遞狀態(tài)或進(jìn)行資源清理的場(chǎng)景

概述

Context 是 Go 語(yǔ)言中非常重要的一個(gè)概念,它主要用于跨多個(gè)函數(shù)或 goroutine 傳遞 取消信號(hào)、超時(shí)控制截止時(shí)間請(qǐng)求范圍數(shù)據(jù)

在并發(fā)編程中,Context 提供了更好的控制和管理,尤其是當(dāng)你需要在多個(gè) goroutine 之間傳遞狀態(tài)或進(jìn)行資源清理時(shí)。

主要功能

Context 主要有以下幾個(gè)功能:

  • 取消信號(hào):通知一個(gè)或多個(gè) goroutine 取消它們正在執(zhí)行的工作。
  • 超時(shí)和截止時(shí)間:指定操作的最大執(zhí)行時(shí)間,防止阻塞操作過(guò)長(zhǎng)時(shí)間。
  • 傳遞請(qǐng)求范圍數(shù)據(jù):攜帶請(qǐng)求范圍內(nèi)的數(shù)據(jù),通常用于請(qǐng)求 ID、用戶信息等。

Context 的三種基本類型

Go 中的 context 包提供了幾種常用的 Context 類型:

  • context.Background():通常作為根 Context,表示沒(méi)有附加數(shù)據(jù)或取消信號(hào)的上下文。它通常是根上下文,作為其他上下文的父上下文。
  • context.TODO():表示你暫時(shí)沒(méi)有確定使用什么樣的 Context,通常用于占位。
  • context.WithCancel(parent):創(chuàng)建一個(gè)可取消的 Context,并返回一個(gè)取消函數(shù),當(dāng)你調(diào)用這個(gè)函數(shù)時(shí),Context 會(huì)被取消。
  • context.WithTimeout(parent, timeout):創(chuàng)建一個(gè)帶有超時(shí)的 Context,指定最大等待時(shí)間,超過(guò)這個(gè)時(shí)間會(huì)自動(dòng)取消。
  • context.WithDeadline(parent, deadline):指定一個(gè)具體的截止時(shí)間,超過(guò)這個(gè)時(shí)間后自動(dòng)取消。
  • context.WithValue(parent, key, value):創(chuàng)建一個(gè)攜帶鍵值對(duì)數(shù)據(jù)的 Context,通常用于傳遞請(qǐng)求級(jí)別的數(shù)據(jù)(例如,用戶身份信息)。

常見用法舉例

context.WithCancel傳遞取消信號(hào)

主要場(chǎng)景:

  • 手動(dòng)控制并發(fā)任務(wù)的終止。
  • 優(yōu)雅退出:在一個(gè)任務(wù)中途需要取消時(shí),用 cancel() 通知所有相關(guān)的 goroutine 停止執(zhí)行。

代碼示例:

package main

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

func main() {
	// 創(chuàng)建一個(gè)可取消的 Context
	ctx, cancel := context.WithCancel(context.Background())

	// 啟動(dòng)一個(gè) goroutine,監(jiān)聽取消信號(hào)
	go func(ctx context.Context) {
		for {
			select {
			case <-ctx.Done(): // 檢測(cè)到取消信號(hào)
				fmt.Println("Goroutine stopped")
				return
			default:
				// 模擬工作
				fmt.Println("Working...")
				time.Sleep(1 * time.Second)
			}
		}
	}(ctx)

	// 主線程等待 3 秒后取消
	time.Sleep(3 * time.Second)
	cancel() // 發(fā)送取消信號(hào)

	// 等待 goroutine 退出
	time.Sleep(1 * time.Second)
	fmt.Println("Main program exited")
}

解釋

  1. 主線程創(chuàng)建了一個(gè)帶有取消功能的上下文 ctx。
  2. 子 goroutine 使用 ctx.Done() 監(jiān)聽取消信號(hào)。
  3. 主線程 3 秒后調(diào)用 cancel(),子 goroutine 檢測(cè)到信號(hào)后優(yōu)雅退出。

使用 WithTimeout 設(shè)置超時(shí)

context.WithTimeout 用于設(shè)置一個(gè)超時(shí)時(shí)間,超過(guò)該時(shí)間后 Context 會(huì)自動(dòng)取消,適用于需要限時(shí)執(zhí)行的操作。防止某些任務(wù)阻塞的時(shí)間過(guò)長(zhǎng)。

package main

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

func main() {
	// 設(shè)置超時(shí)時(shí)間為 2 秒
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel() // 確保超時(shí)后取消 ctx

	// 啟動(dòng)一個(gè)模擬長(zhǎng)時(shí)間執(zhí)行的任務(wù)
	go longRunningTask(ctx)

	// 等待超時(shí)或任務(wù)完成
	<-ctx.Done()
	if ctx.Err() == context.DeadlineExceeded {
		fmt.Println("Timeout reached")
	}
}

func longRunningTask(ctx context.Context) {
	select {
	case <-time.After(3 * time.Second): // 模擬長(zhǎng)時(shí)間任務(wù)
		fmt.Println("Task completed")
	case <-ctx.Done():
		// 任務(wù)被取消或超時(shí)
		fmt.Println("Task cancelled due to timeout")
	}
}

WithDeadline的用法和Withtimeout用法類似,只是一個(gè)傳入的參數(shù)是等待時(shí)間,一個(gè)傳入的參數(shù)是截止時(shí)間。

使用 WithValue 傳遞數(shù)據(jù)

context.WithValue 可以在 Context 中存儲(chǔ)鍵值對(duì),通常用于傳遞請(qǐng)求級(jí)別的數(shù)據(jù)(例如用戶身份、請(qǐng)求 ID 等)。

package main

import (
	"context"
	"fmt"
)

func main() {
	// 創(chuàng)建一個(gè)上下文并傳遞數(shù)據(jù)
	ctx := context.WithValue(context.Background(), "userID", 12345)

	// 將 ctx 傳遞給其他函數(shù)
	processRequest(ctx)
}

func processRequest(ctx context.Context) {
	// 從 ctx 中提取數(shù)據(jù)
	userID := ctx.Value("userID")
	if userID != nil {
		fmt.Println("User ID:", userID)
	} else {
		fmt.Println("No user ID found")
	}
}

使用 WithValue 小心context.WithValue 并不是用于傳遞大量數(shù)據(jù)的,主要用于傳遞少量的上下文信息,比如請(qǐng)求 ID 等。

如果傳遞過(guò)多的數(shù)據(jù),會(huì)使得 Context 難以維護(hù)。

常用的相關(guān)方法和常量

  • ctx.Done():返回一個(gè) channel,當(dāng) Context 被取消時(shí)該 channel 會(huì)被關(guān)閉。
  • ctx.Err():返回 Context 被取消的錯(cuò)誤,通常是 context.Canceledcontext.DeadlineExceeded
  • ctx.Value(key):獲取在 Context 中傳遞的數(shù)據(jù)。

context如何控制goroutine的執(zhí)行

從上面的舉例可以看出,在每個(gè)goroutine中通過(guò)判斷ctx.Done()是否被執(zhí)行,從而知道任務(wù)是否被取消/超時(shí)/到達(dá)截止日期。

當(dāng) Context 被取消(調(diào)用 cancel())或超時(shí)/到達(dá)截止時(shí)間時(shí),ctx.Done() 所關(guān)聯(lián)的 channel 會(huì)關(guān)閉,此時(shí)select語(yǔ)句就可以執(zhí)行ctx.Done()對(duì)應(yīng)的分支。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Go代碼檢查的推薦工具及使用詳解

    Go代碼檢查的推薦工具及使用詳解

    這篇文章主要為大家介紹了Go代碼檢查的推薦工具及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Golang設(shè)計(jì)模式工廠模式實(shí)戰(zhàn)寫法示例詳解

    Golang設(shè)計(jì)模式工廠模式實(shí)戰(zhàn)寫法示例詳解

    這篇文章主要為大家介紹了Golang 工廠模式實(shí)戰(zhàn)寫法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • GO中?分組聲明與array,?slice,?map函數(shù)

    GO中?分組聲明與array,?slice,?map函數(shù)

    這篇文章主要介紹了GO中?分組聲明與array,slice,map函數(shù),Go語(yǔ)言中,同時(shí)聲明多個(gè)常量、變量,或者導(dǎo)入多個(gè)包時(shí),可采用分組的方式進(jìn)行聲明,下面詳細(xì)介紹需要的小伙伴可以參考一下
    2022-03-03
  • Go語(yǔ)言同步與異步執(zhí)行多個(gè)任務(wù)封裝詳解(Runner和RunnerAsync)

    Go語(yǔ)言同步與異步執(zhí)行多個(gè)任務(wù)封裝詳解(Runner和RunnerAsync)

    這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言同步與異步執(zhí)行多個(gè)任務(wù)封裝(Runner和RunnerAsync)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 利用Golang生成整數(shù)隨機(jī)數(shù)方法示例

    利用Golang生成整數(shù)隨機(jī)數(shù)方法示例

    這篇文章主要介紹了利用Golang生成整數(shù)隨機(jī)數(shù)的相關(guān)資料,文中給出了詳細(xì)的介紹和完整的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • Go-Web框架中AOP方案的實(shí)現(xiàn)方式

    Go-Web框架中AOP方案的實(shí)現(xiàn)方式

    本文主要介紹了Go-Web框架中AOP方案的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go Gin 處理跨域問(wèn)題解決

    Go Gin 處理跨域問(wèn)題解決

    在前后端分離的項(xiàng)目中,經(jīng)常會(huì)遇到跨域問(wèn)題,本文主要介紹了Go Gin 處理跨域問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Go語(yǔ)言實(shí)現(xiàn)UDP版聊天小工具的示例詳解

    Go語(yǔ)言實(shí)現(xiàn)UDP版聊天小工具的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)聊天小工具(UDP版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang實(shí)現(xiàn)CronJob(定時(shí)任務(wù))的方法詳解

    Golang實(shí)現(xiàn)CronJob(定時(shí)任務(wù))的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Golang如何通過(guò)一個(gè)單 pod 去實(shí)現(xiàn)一個(gè)常駐服務(wù),去跑定時(shí)任務(wù)(CronJob),文中的示例代碼講解詳細(xì),需要的可以參考下
    2023-04-04
  • GoLang之go build命令的具體使用

    GoLang之go build命令的具體使用

    本文主要介紹了GoLang之go build命令的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論