gpt4 book ai didi

Golang channel 维护

转载 作者:IT王子 更新时间:2023-10-29 01:07:33 28 4
gpt4 key购买 nike

我正在使用 go channels 作为类似队列的机制,这非常适合我。我正在为每个用户打开这些类似队列的 channel 之一,并为这些 channel 中的每一个都有一个 for-range 循环。唯一的问题是我不会关闭任何这些 channel 。

我想知道 Go 中是否习惯于在定时器上运行一个 go-routine,该定时器基本上会破坏不活动的 channel ,几乎就像一个“智能”垃圾收集器。

如有任何反馈,我们将不胜感激。

谢谢。

最佳答案

为 channel 读写提供超时是一种常见的做法。这是一种安全措施,可确保 goroutine 在经过给定的时间间隔后停止阻塞。

一个用例是您启动 N 个例程以在各种 http 客户端上执行异步搜索。您会希望尽可能多地等待结果,但您不想永远等待。这些 http fetcher 将执行查询并将结果发回给您,前提是它们可以在设定的超时时间内完成任务。

这是该原则的一个简单版本。您可以在 Go playground 上运行它.这里唯一的区别是 goroutine正在从我们的队列 channel 读取数据,而不是向我们发送数据。但原理是一样的。

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
}

关于Golang channel 维护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21977110/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com