2014-02-24 103 views
3

我使用go通道作爲類似隊列的機制,它非常適合我。我爲每個用戶打開了一個類似隊列的頻道,併爲這些頻道中的每一個頻道提供了一個範圍循環。唯一的是我沒有關閉任何這些頻道。Golang Channel維護

我想知道它是否習慣於在基本上破壞非活動通道的定時器上運行go-routine,幾乎就像一個「智能」垃圾回收器。

任何反饋將不勝感激。

謝謝。

+0

您不需要關閉Go中的頻道,它們不像unix文件描述符或類似的東西。我不知道這是你問的,但我想我會指出。 –

回答

3

通常的做法是提供通道讀取和寫入超時。這是一個安全措施,確保一個特定的時間間隔已經過去的時候,goroutine會停止阻塞。

這是一個用例,它激發N個例程在不同的http客戶端上執行異步搜索。你會想盡可能多的等待結果,但你不想永遠等下去。這些http fetchers將執行他們的查詢並將結果發回給你,只要他們能夠在設定的超時時間內完成任務。

下面是該原理的簡單版本。你可以在Go playground上運行它。這裏唯一的區別是,goroutine 正在從我們的隊列頻道讀取,而不是發送給我們的數據。但原則是相同的。

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    queue := make(chan int, 1) 
    defer close(queue) 

    // Fire up a consumer. 
    // Ensure it times out after 3 seconds of waiting for a value. 
    go func() { 
     select { 
     case val := <-queue: 
      fmt.Printf("Received: %d\n", val) 
     case <-time.After(3 * time.Second): 
      fmt.Println("Timeout!") 
     } 
    }() 

    // Do something important for 5 seconds. 
    <-time.After(5 * time.Second) 

    // Send value to user. 
    queue <- 123 
} 
+1

這不是一個很好的例子。 main()函數實際上可能在您的goroutine進入Print {f,ln}語句之前結束/關閉(因此程序結束)。您通常會想要在goroutine中執行「工作」並等待產卵(主)功能的結果。 – mzimmerman