golang的context和net Conn怎麼結合使用比較好?

時間 2021-06-05 01:17:24

1樓:冒泡

自問自答一下,在標準庫原始碼找到了乙個相對好的做法,是順著DialContext找下去,在src/net/fd_unix.go中的netFD的connect方法實現中

大致做法,例如我們封裝乙個ReadContext:

1 主邏輯協程(呼叫ReadContext的)照常做Read之類的IO操作,另外開個輔助協程來監控ctx.Done()

2 若輔助協程監控到了ctx.Done(),則通過SetDeadline打斷主邏輯阻塞的Read

3 Read返回錯誤後通過檢查ctx.Done()來判斷是被打斷,還是其他錯誤

4 ReadContext返回的時候需要清理掉輔助協程,避免殘留,因此還需要兩個chan,乙個用於在ctx.Done()沒觸發的時候通知輔助協程退出,另乙個用於等待確認輔助協程已退出

當然還需要考慮一些細節問題,比如用defer來保證在panic的時候也能通知到輔助協程退出等

這個做法主要技術點是通過SetDeadline打斷Read和Write,當然Close也可以,但Close有點粗暴(如果Done之後還要繼續用這個conn呢),但是SetDeadline畢竟也是改了conn的狀態的,所以要封裝得更好的話,還是別直接操作conn,在外面再包一層結構比較好,如果考慮到併發訪問可能還要再改進下(比如兩個協程用不同的ctx去對乙個conn做Read,乙個Done了後SetDeadline打斷了兩個呼叫)

2樓:

package

main

import

("context"

"fmt"

"io/ioutil"

"net"

"time"

)func

main

()var

out=

make

(chan

BufData,1

)// a new goroutine

gofunc

(ctx

context

.Context

)out

<-data

return

}defer

conn

.Close

()data

.Buf

,data

.Err

=ioutil

.ReadAll

(conn

)select

}(ctx

)select

// do some thing to data.Buffmt.

Println

(string

(data

.Buf

))case

<-ctx.

Done

():fmt

.Println

(ctx

.Err

())// "context deadline exceeded"

return}}

TypeScript和Golang,各有哪些特色,應該選擇學習哪一門,它們的設計者,到底誰更厲害?

qgymje 簡單來說看你自己是做前端還是後端,兩者如果比較的化只能讓typescript用在node環境上與Go比較,因此你可以將問題簡化為Node與Go的比較 tefx 跟設計者誰厲害有什麼關係。這樣想的話先學C啊,好歹作者身上有圖靈獎啊。話說這兩個語言為什麼會被放在一起比較。前端 script...

請問 golang 和 Python哪個簡單易學一些

金子 其實對於語言來說,我覺得都是通用的,主要是邏輯思想,如果是零基礎建議先從python 下手,因為他立馬就能有應用場景畢竟是指令碼上可以處處發揮,屬於長久積累。 天國的502 為什麼總有人說python簡單 是,python好上手,可是你怎麼讓乙個新手去解決各種版本上的問題?python庫多,但...

如何評價golang的time Format方法一定要用2006 01 02 15 04 05作引數?

Diamond Mine 用血的教訓告訴大家,這個設計真的有點坑。某個需求修改,程式設計師a需要格式化時間,順手去網上抄了個格式化串 2006 01 02 03 04 05 乍一看,也沒啥大問題,code review也通過了。結果一上線,發現hour錯了,應該用 15 04 24小時制 而不是 0...