gpt4 book ai didi

go - 是否可以从 channel ch 读取 len(ch) 消息?

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

我正在运行单个 goroutine 来处理与某些用户相关的消息 channel 。处理消息后,用户状态由 goroutine 更新并存储在数据库中。当对数据库的请求正在进行时,可以将许多消息发送到 channel 。我想在向数据库发送另一个请求之前处理它们。

目前我正在使用 len(ch) 检查 channel 中的消息数量并在 for 循环中读取它们。

func (c *consumer) handleUser(userID string, ch chan Message) {
user := c.db.LoadUser(userID)
for {
var msgs []Message
for n := len(ch); n > 0; n-- {
msgs = append(msgs, <-ch)
}
apply.Messages(user, msgs)
c.db.SaveUser(user)
}

ch := make(chan Message, 100)
go c.handleUser("user-1", ch)

我在互联网上搜索这是否是某种常见模式,但我找不到类似的解决方案,我想知道我的方法是否适用于 go 程序。

最佳答案

您的解决方案会导致生成的 goroutine 在 channel 上旋转,直到至少发送了一条消息。换句话说,goroutine 根本不会阻塞。

在这里,您正在尝试一批处理多条消息。有不同的方法来实现它。但要回答的主要问题是:你怎么知道这批消息是完整的?发送方 goroutine 可能知道这一点,它可以将所有消息打包到一个片段中。另一方面,您可能不知道批处理何时准备就绪。在这些情况下,您需要使用超时,如下例所示。

func (c *consumer) handleUser(userID string, ch chan Message) {
user := c.db.LoadUser(userID)
for {
var msgs []Message
select {
case msg := <-ch:
//Append the message in the current batch slice
msgs = append(msgs, msg)
//Wait up to 5 seconds and then process the batch
case <-time.After(time.Second * 5):
//Timeout: process the batch of messages
if len(msgs) > 0 {
apply.Messages(user, msgs)
c.db.SaveUser(user)
}
}
}
}

请注意,执行此函数的可能 goroutine 仅在实际有事要做时才运行。

关于go - 是否可以从 channel ch 读取 len(ch) 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56471664/

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