chan + select 是go 中比較優雅結束乙個 goroutine 的方式 但是當goroutine 衍生出其他更多的 goroutine 的時候怎麼管理呢?
context 就提供這麼一種處理的方法 我看大佬們都稱之為 上下文 0.0
context.background()
返回乙個空的context
我們可以用這個 空的 context 作為 goroutine 的root 節點(如果把整個 goroutine 的關係看作 樹狀)
使用context.withcancel(parent)
函式,建立乙個可取消的子context
函式返回值有兩個:子context cancel 取消函式
例如:
ctx, cancel := context.withcancel(context.background())當要結束goroutine 的時候我們用函式 cancel() 傳送乙個取消指令
<- ctx.done() 如果接受到值 表示受到這個取消的指令
如果 多個 goroutine 用同乙個 context 作為引數 那麼 只要這個 context 呼叫了 cancel 多個goroutine 就會同時受到 取消指令
假設有 context 爸爸和 context 兒子
如果 context 爸爸關閉了 他的兒子也會受到 取消指令0.0 全都 gg 了
返回的 cancelfunc 可以取消乙個context,以及這個節點context下所有的所有的context,不管有多少層級。
type context inte***ceerr() error
value(key inte***ce{}) inte***ce{}
context的介面定義的比較簡潔,我們看下這個介面的方法
這個介面共有4個方法,了解這些方法的意思非常重要,這樣我們才可以更好的使用他們。
deadline
方法是獲取設定的截止時間的意思,第乙個返回式是截止時間,到了這個時間點,context會自動發起取消請求;第二個返回值ok==false時表示沒有設定截止時間,如果需要取消的話,需要呼叫取消函式進行取消。
done
方法返回乙個唯讀的chan,型別為struct{}
,我們在goroutine中,如果該方法返回的chan可以讀取,則意味著parent context已經發起了取消請求,我們通過done
方法收到這個訊號後,就應該做清理操作,然後退出goroutine,釋放資源。
err
方法返回取消的錯誤原因,因為什麼context被取消。
value
方法獲取該context上繫結的值,是乙個鍵值對,所以要通過乙個key才可以獲取對應的值,這個值一般是執行緒安全的。
context介面並不需要我們實現,go內建已經幫我們實現了2個,我們**中最開始都是以這兩個內建的作為最頂層的partent context,衍生出更多的子context。var (
background = new(emptyctx)
todo = new(emptyctx)
func background() context {
return background
func todo() context {
return todo
參考於
lombok學習及使用
1.新增依賴和外掛程式plu 2.不使用lombok 展示 private long id private string name private integer age private string email public long getid public void setid long id...
Apache NiFi學習及使用的記錄
nifi的設計概念與流式程式設計模型 flowbased programming,fbp 的主要概念相似,以下是兩者相似概念的對應關係表與注釋。對於理解nifi的實現機制具有幫助 flowfile 乙個flowfile代表每個被系統處理的資料物件,乙個flowfile由兩部分組成 屬性和內容。內容是...
python學習 pip安裝及使用
需要安裝幾個軟體包 pip nose virtualenv distribute 在此記錄linux下安裝python軟體包的安裝方法 在pip的python官網上我們可以看到,pip 是 a tool for installing and managing python packages.也就是說...