2014-02-24 63 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