用例
我想在mysql数据库中保存大量数据,这些数据是通过通道接收的。出于性能原因,我将它们分为10个项目进行处理。我每3小时才收到一次输入项。
问题
假设我得到了10004个项目,那么剩下4个项目,因为我的go例程等待10个项目,然后才能成批“清除它们”。我想确保它创建的批处理少于10个项目,以防该通道中没有更多的项目(该通道也被生产商关闭)。
代码:
// ProcessAudits sends the given audits in batches to SQL
func ProcessAudits(done <-chan bq.Audit) {
var audits []bq.Audit
for auditRow := range done {
user := auditRow.UserID.StringVal
log.Infof("Received audit %s", user)
audits = append(audits, auditRow)
if len(audits) == 10 {
upsertBigQueryAudits(audits)
audits = []bigquery.Audit{}
}
}
}
我是新来的,我不知道如何正确地实施这一点?
2条答案
按热度按时间ckx4rj1h1#
这是一个有效的例子。当通道关闭时,范围退出,因此您可以在循环之后处理任何剩余的项。
输出:
4uqofj5v2#
你也可以用定时器。在这里玩例子https://play.golang.org/p/0atlgvcl-px