Golang实践经验和教训( 十 )

timeout.timer = time.AfterFunc(time.Duration(timeout.duration) * time._Second_ func() {

stateLock.Lock()

defer stateLock.Unlock()

timeout.callback(timeout.session)

)

和无锁的区别是全局映射中的更新是同步的 , 但这不能阻止在调用超时后运行timeout.Cancel()如果计划的计时器已过期但未抓住锁 , 则情况如此然而 。

使用Cancel通道

可以使用cancel通道 , 而不必依赖timer.Stop()(不会阻止到期的计时器执行) ,

这是一个略有不同的方法 。 这样可以将不再通过回调进行递归重新安排 , 而会注册一个无限循环 , 等待cancel信号或超时事件 。

新的Register产生一个新的go线程 , 该线程在超时后运行回调 , 并在执行前一个超时后安排新的超时 。 cancel通道返回给调用方 , 以控制循环应在何时停止 。

推荐阅读