国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

GOLANG使用Context實現傳值、超時和取消的方法

2020-04-01 18:50:15
字體:
來源:轉載
供稿:網友

GO1.7之后,新增了context.Context這個package,實現goroutine的管理。

Context基本的用法參考GOLANG使用Context管理關聯goroutine

實際上,Context還有個非常重要的作用,就是設置超時。比如,如果我們有個API是這樣設計的:

type Packet interface {  encoding.BinaryMarshaler  encoding.BinaryUnmarshaler}type Stack struct {}func (v *Stack) Read(ctx context.Context) (pkt Packet, err error) {  return}

一般使用是這樣使用,創建context然后調用接口:

ctx,cancel := context.WithCancel(context.Background())stack := &Stack{}pkt,err := stack.Read(ctx)

那么,它本身就可以支持取消和超時,也就是用戶如果需要取消,比如發送了SIGINT信號,程序需要退出,可以在收到信號后調用cancel:

sc := make(chan os.Signal, 0)signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM)go func() {  for range sc {    cancel()  }}()

如果需要超時,這個API也不用改,只需要調用前設置超時時間:

ctx,cancel := context.WithTimeout(context.Background(), 3*time.Second)defer cancel()pkt,err := stack.Read(ctx)

如果一個程序在運行,比如Read在等待,那么在沒有人工干預的情況下,那就應該自己運行就好了。而人工干預,也就是需要取消,比如要升級程序了,或者需要停止服務了,都屬于這種取消操作。而超時,一般是系統的策略,因為不能一直等下去,就需要在一定時間沒有反應時終止服務。實際上context這兩個都能支持得很好,而且還不影響Read本身的邏輯,在Read中只需要關注context是否Done:

func (v *Stack) Read(ctx context.Context) (pkt Packet, err error) {  select {  // case <- dataChannel: // Parse packet from data channel.  case <- ctx.Done():    return nil,ctx.Err()  }  return}

這是為何context被接納成為標準庫的包的緣故了吧,非常之強大和好用,而又非常簡單。一行context,深藏功與名。

另外,Context還可以傳遞上下文的Key-Value對象,比如我們希望日志中,相關的goroutine都打印一個簡化的CID,那么就可以用context.WithValue,參考go-oryx-lib/logger。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉义市| 松潘县| 宿松县| 惠安县| 眉山市| 辽中县| 南宫市| 深圳市| 乌拉特后旗| 阳信县| 灵石县| 光泽县| 夹江县| 乐亭县| 平昌县| 怀化市| 广州市| 吴川市| 敖汉旗| 南郑县| 耿马| 桐梓县| 清河县| 绥化市| 特克斯县| 大姚县| 石门县| 托里县| 周宁县| 公主岭市| 汕尾市| 那曲县| 平顶山市| 宁国市| 微山县| 曲松县| 延川县| 金溪县| 民丰县| 沾化县| 蒙阴县|