gpt4 book ai didi

go - 如何尽可能晚地计算要在 channel 上发送的消息?

转载 作者:数据小太阳 更新时间:2023-10-29 03:19:11 24 4
gpt4 key购买 nike

我的场景:

  • 我有一个生产者和一个消费者。两者都是 goroutine,它们通过一个 channel 进行通信。
  • 生产者能够(理论上)随时生成消息。
  • 生成消息需要一些计算。
  • 消息对时间有些敏感(即消息越旧,相关性越低)。
  • 消费者偶尔会从 channel 中阅读。对于此示例,假设消费者使用 time.Ticker 每隔几秒阅读一次消息。
  • 消费者更喜欢“新鲜”消息(即尽可能最近生成的消息)。

因此,问题是:生产者如何尽可能晚地生成消息?


显示总体思路的示例代码:

func producer() {
for {
select {
...
case pipe <- generateMsg():
// I'd like to call generateMsg as late as possible,
// i.e. calculate the timestamp when I know
// that writing to the channel will not block.
}
}
}

func consumer() {
for {
select {
...
case <-timeTicker.C:
// Reading from the consumer.
msg <- pipe
...
}
}
}

完整代码(与上面略有不同)可在 Go Playground 获得:https://play.golang.org/p/y0oCf39AV6P


我的一个想法是检查写入 channel 是否会阻塞。如果它不会阻塞,那么我可以生成一条消息然后发送它。然而……

  • 我找不到任何方法来测试写入 channel 是否会阻塞。
  • 在一般情况下,这是一个坏主意,因为如果我们有多个生产者,它会引入竞争条件。在这个具体案例中,我只有一个制作人。

另一个(坏的)想法:

func producer() {
var msg Message
for {
// This is BAD. DON'T DO THIS!
select {
case pipe <- msg:
// It may send the same message multiple times.
default:
msg = generateMsg()
// It causes a busy-wait loop, high CPU usage
// because it re-generates the message all the time.
}
}
}

最佳答案

This answer (对于 Go non-blocking channel send, test-for-failure before attempting to send? )建议使用第二个 channel 将信号从消费者发送到生产者:

  1. 消费者想要收到一条消息(例如,在收到来自 timer.Ticker 的报价后)。
  2. 消费者通过侧 channel 向生产者 goroutine 发送信号。 (因此,对于这个侧 channel ,生产者/消费者的角色是相反的)。
  3. Producer 从侧 channel 接收信号。
  4. 生产者开始计算真实消息。
  5. Producer通过主 channel 发送消息。
  6. 消费者收到消息。

关于go - 如何尽可能晚地计算要在 channel 上发送的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56559684/

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