簡體   English   中英

如何有效地將goroutine中分配的結構通過通道傳遞回主例程?

[英]How do I efficiently pass a struct allocated in a goroutine back to the main routine via a channel?

在基本級別上,我有一個主例程,該例程生成多個goroutine來處理數據。 每次goroutine處理數據時,它都會發回一個大小可變的結構(每次都包含從goroutine內部分配的切片和/或數組)。

數據不是很大(例如,幾兆字節),但是總的來說,將指針轉移到數據而不是全部副本是否更有效(並且更安全)? 如果數據結構是靜態的,並且我將指針傳遞給它,則有可能在我仍在處理上一次調用的結果時更改結構(如果它已完全重新分配,那么這可能不是問題)。

發送指向值的指針是可以的並且很常見。 如果該值較大,則發送指向該值的指針將比發送該值更有效。 運行基准以找出“大”的大小。

注意,您必須防止不安全的並發訪問該值。 防止不安全的並發訪問的常見策略是:

  • 將值的所有權從發送方傳遞到接收方。 發送者在發送后將不訪問該值。 接收者可以用該值做任何想要的事情。
  • 發送后將值視為只讀。 發送方或接收方在發送后都不會修改該值。

據我了解,您正在嘗試執行以下操作:

func watchHowISoar() (ch chan *bigData) {
    ch = make(chan *bigData)
    go func() {
        for i := 0; i < 10; i++ {
            bd := &bigData{i}
            ch <- bd
            // as long as you don't modify bd inside this goroutine after sending it, you're safe.
        }
        close(ch)
    }()
    return
}
func main() {
    for iamaleafOnTheWind := range watchHowISoar() {
        fmt.Printf("%p\n", iamaleafOnTheWind)
    }
}

只要您在發送后不修改發件人發送的數據,這是絕對安全的。

如果您有疑問,請嘗試使用go run -race main.go來運行它,而種族檢測器並不完美,它通常會檢測出類似的東西。

暫無
暫無

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

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