【发布时间】:2017-07-10 14:06:18
【问题描述】:
在 Golang 中,我对将contexts 下游传递给其他方法和函数的意图相当陌生。我了解 context 的工作原理、使用方式、保存值的方式、与父级 context 的关系及其行为 - 我只是不明白为什么要使用首先是上下文。
在一个更具体的例子中,这是这个问题的实际原因,在我工作的公司中,我们发现了一些非常长时间运行的查询,这些查询由于边缘情况而经常发生。
考虑到在我们投入时间解决根本原因之前的限制,我们决定采取的一个显而易见的解决方案是终止耗时超过 5 分钟的查询。
运行我们的事务的方法接受最初在 API 调用中启动的 context。这个context 一直传递给事务函数。在那一刻,我找到了 2 个解决方案来终止该查询:
1) 使用新的上下文:
发起一个新的
context.WithTimeout(ctx, time.Duration( 5 * time.Minute) )观察
go routine中的Done频道,并在有信号时终止交易- 如果事务及时成功完成,只需
cancel上下文并按预期提交事务。
2) 使用Timer:
- 创建一个持续时间为 5 分钟的
Timer - 如果时间结束,终止事务
- 否则,提交事务。
从逻辑上讲,它们是相同的解决方案,但是,何时以及如何决定是使用具有设定截止日期的 context 还是使用旧的 Timer?
【问题讨论】:
-
从 1.8 开始,
database/sql支持使用上下文。我想这可以简化您的决定。
标签: go timer transactions