簡體   English   中英

慣用Golang goroutines

[英]Idiomatic Golang goroutines

在Go中,如果我們的類型具有啟動某些循環機制的方法(輪詢A並永遠執行B),最好將其表達為:

// Run does stuff, you probably want to run this as a goroutine
func (t Type) Run() {
    // Do long-running stuff
}

並記錄這可能是想作為goroutine啟動(並讓調用者處理)

或者從調用者隱藏它:

// Run does stuff concurrently
func (t Type) Run() {
   go DoRunStuff()
}

我是Go的新手,並且不確定慣例是否說調用者前綴為'go'或者當代碼設計為運行異步時為他們執行。

我目前的觀點是我們應該記錄並給呼叫者一個選擇。 我的想法是,在Go中,並發性實際上並不是暴露接口的一部分,而是使用它的屬性。 這是正確的嗎?

我對此有你的看法,直到我開始編寫一個我希望並發的Web服務的適配器。 我有一個go例程,必須啟動它來解析從Web調用返回到通道的結果。 絕對沒有這種API可以在不將其用作go例程的情況下工作的情況。

然后我開始查看net / http等軟件包。 該包中存在強制並發。 在接口級別記錄它應該能夠並發使用,但是默認實現自動使用go例程。

因為Go的標准庫通常會在自己的包中觸發go例程,所以我認為如果你的包或API保證它,你可以自己處理它們。

我目前的觀點是我們應該記錄並給呼叫者一個選擇。

我傾向於同意你的觀點。

由於Go使得同時運行代碼變得如此容易,因此您應該盡量避免API中的並發(這會迫使客戶端同時使用它)。 相反,創建一個同步API,然后客戶端可以選擇同步或同時運行它。

幾年前的一次演講中討論了這個問題: 十二個最佳實踐

特別是,幻燈片26顯示的代碼更像您的第一個示例。

我會將net/http包視為異常,因為在這種情況下,並發性幾乎是強制性的。 如果包在內部不使用並發,那么客戶端代碼幾乎肯定必須。 例如, http.Client不(據我所知)啟動任何goroutines。 只有服務器這樣做。

在大多數情況下,它將成為調用方代碼的一行:

go Run()StartGoroutine()

同步API並不難同時使用,並為調用者提供了更多選項。

由於情況不同,沒有“正確”的答案。

顯然,在某些情況下,API可能包含實用程序,簡單算法,數據集合等,如果打包為goroutines則會顯得很奇怪。

相反,在某些情況下,很自然地需要“引擎蓋下”並發,例如豐富的IO庫(http服務器就是明顯的例子)。

對於更極端的情況,請考慮您要生成一個即插即用並發服務庫。 這樣的API由模塊組成,每個模塊通過通道具有良好描述的接口。 顯然,在這種情況下,它將不可避免地涉及作為API的一部分開始的goroutines。

一個線索可能是函數參數中是否存在通道。 但我希望能夠清楚地記錄出任何一種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM