gpt4 book ai didi

go - 在 go routine 中延迟调用

转载 作者:IT王子 更新时间:2023-10-29 01:51:26 25 4
gpt4 key购买 nike

我相信我对 defer 在正常用例中的理解很好。比如这个问题中列出的Golang defer behavior .但是,我对在不返回的 goroutine 中调用 defer 时发生的情况感到有点困惑。这是有问题的代码。

func start_consumer() {
conn, _ := amqp.Dial("amqp://username:password@server.com")
//defer conn.Close()

ch, _ := conn.Channel()
//defer ch.Close()

q, _ := ch.QueueDeclare(
"test", // name
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)

_ = ch.Qos(
3, // prefetch count
0, // prefetch size
false, // global
)

forever := make(chan bool)

go func() {
for {
msgs, _ := ch.Consume(
q.Name, // queue
"", // consumer
false, // ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)

for d := range msgs {
log.Printf("Received a message: %s", d.Body)
d.Ack(true)
}

time.Sleep(1 * time.Second)
}
}()

log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
}

这个函数调用自

go start_consumer()

这可能是我对 channel 工作方式的误解,但我永远不会返回,因为它正在等待传递给它的值。

最佳答案

Go 博客的 Defer, Panic, and Recover上一个问题中引用的帖子很好地解释了延迟语句的工作原理。

A defer statement pushes a function call onto a list. The list of saved calls is executed after the surrounding function returns. Defer is commonly used to simplify functions that perform various clean-up actions.

在您的情况下,由于 goroutine 不会返回,因此延迟调用列表将永远不会运行。这使得 defer 语句在这种情况下是不必要的。

关于go - 在 go routine 中延迟调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27555243/

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