Golang实践经验和教训(14)
func (timeout* TimeoutHandler) Cancel() {
if timeout.cancelChan == nil {
return
select {
case timeout.cancelChan <- struct{{:
default:
// can't send on the channel someone has already requested the cancellation.
结论
实践中了解了在使用并发代码时出现常见的常见错误 。 由于其不确定性 , 即使进行大量测试 , 也很容易发现这些问题 。 这是HALO在实现中遇到的三个主要问题:
在不同步的情况下更新共享数据
这似乎很明显 , 但是如果同时进行的更新发生在不同的位置 , 则实际上很难发现 。 结果是数据竞争 , 由于一个更新会覆盖另一个更新 , 对同一数据的多次更新可能导致更新丢失 。 在HALO中 , 正在更新同一共享映射上的计划超时参考 。 (有趣的是 , 如果Go在同一个Map对象上检测到并发读/写操作 , 会引发致命错误 , 可以尝试运行Go的数据竞争检测器) 。 最终会导致丢失超时引用 , 并且无法取消给定的超时 。 不要是可以使用锁 。
推荐阅读
- 原神|原神:不要专门跑去抽4星,以前的教训,让人印象深刻
- 手机游戏|于月仙事件的惨痛教训:不要雇佣一个“手游上瘾”的人!
- edg战队|FPX战胜EDG打出3个名场面,圣枪哥装杯被新人教训,Viper化身院长
- RNG|没有吸取DK的教训?RNG差点“翻车”,米勒说出心里话
- 梦幻西游|梦幻西游:男子沉迷于游戏,半年亏掉30多万,血与泪的教训!
- 大话西游|大话西游2(299)痛的教训!02年老玩家提示不要拿垃圾刷熟练度啊
- 暴雪|暴雪吸取了教训,《暗黑破坏神2:复活》测试的效果还不错
- 我的世界|我的世界:10个“过来人”的经验教训,处理好细节才能笑到最后!
- 华为|又想骗中国放弃自研?特朗普同意解封华为,损失1000亿后买来教训
- 华为|台积电之后,美国瞄准中芯国际?华为余承东:这是教训!