go語言中關於上下文相關的知識2. 上下文傳遞值
3. 超時取消
1.1 樹根
上下文在某個環境中定義了兩棵樹,分別是:
樹a
ctxa := context.
background
()
樹b
ctxb := context.
todo
()
可以把a
和b
作為樹的根節點,從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.withdeadline
和context.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提供了原子...