go併發程式設計之一 上下文context

2021-09-10 07:48:01 字數 3508 閱讀 7169

go語言中關於上下文相關的知識

2. 上下文傳遞值

3. 超時取消

1.1 樹根

上下文在某個環境中定義了兩棵樹,分別是:

a

ctxa := context.

background

()

b

ctxb := context.

todo

()

可以把ab作為樹的根節點,從context包裡能看到這兩個方法的底層實現其實一模一樣,可能

是為了某個環境需要有多個上下文同時使用而設立的

1.2 樹葉

1.2.1 context.withcancel

樹葉包括四個方法:

context.withcancel帶取消方法的派生上下文

ctxc,cancel := context.

withcancel

(ctxa)

defer

cancel

()

1.2.2 context.withdeadline和context.withtimeout

context.withdeadlinecontext.withtimeout都是超時自動取消,其中 timeout的底層

實現還是deadline,只不過換了個形式罷了

ctxd,cancel := context.

withdeadline

(ctx,time.

now().

add(

1* time.second)

)ctxe,cancel := context.

withtimeout

(ctx,

1* time.second)

1.2.1 context.withvalue

context.withvalue給上下文新增鍵值對

新增:

const golable_key =

"context"

ctxf = context.

withvalue

(ctxa, golable_key,

"hello world"

)

取值:

value := ctxf.

value

(golable_key).(

string

)log.

println

(value)

我們有時候會遇到某個上下文在傳遞的時候,需要進行資料的檢查,這時候可以用上

context.withvalue----儲存和檢索附加於請求的資料報

如下例:

package main

import

("context"

"fmt"

)func

main()

type ctxkey int

const

( ctxuserid ctxkey =

iota

ctxauthtoken

)func

userid

(c context.context)

string

func

authtoken

(c context.context)

string

func

processrequest

(userid, authtoken string

)func

handleresponse

(ctx context.context)

有時候,我們會遇到比較耗費時間的程式,比如傳送郵件等,這裡我們用

time.

after(5

* time.second)

來模擬耗時5秒的處理過程通道,然後使用上下文來取消整個超時操作,釋放阻塞資源, 程式稍微有點長

很容易不耐煩,所以加了張圖 幫助理解

}列印結果:

canceled2

canceled1

Go併發程式設計之CAS操作

一 前言 go語言類似j a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖 cas 原子變數操作類。相比j a來說go提供了獨特的基於通道的同步措施。我們先來看看go中cas操作 二 cas操作 go中的cas操作與j a中類似,都是借用了cpu提供的原子性指令來實...

併發程式設計之多執行緒篇之一

本節主要知識點包括三個方面 一 執行緒的含義 二 程序和執行緒的區別 三 開啟程序的兩種方式 1 什麼是執行緒和多執行緒?1 在傳統作業系統中,每個程序有乙個位址空間,而且預設就有乙個控制線程。執行緒顧名思義,就是一條流水線工作的過程 流水線的工作需要電源,電源就相當於cpu 而一條流水線必須屬於乙...

Go併發程式設計之美 Load Store操作

一 前言 go語言類似j a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖 cas 原子變數操作類。相比j a來說go提供了獨特的基於通道的同步措施。本節我們先來看看go中load store操作 二 load store操作 go中的load和store提供了原子...