作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何以线程安全的方式进行延迟的,可重新启动的函数调用?例如,这是一个很常见的用例,如果您想对某些更改使用react,但不超过X毫秒一次。
我能想到的代码是:
var t *time.Timer
func restartableDelayed() {
if t != nil {
t.Stop()
}
t = time.AfterFunc(time.Second, func() {
t = nil
// ...
// Do the stuff here
// ...
})
}
此处明显的问题是,除了初始分配外,
t = nil
分配是从另一个goroutine调用的,而初始分配会受到竞争的影响。
t
的访问,但这感觉有点麻烦。还有更简洁的选择吗?
最佳答案
我认为在这里使用互斥锁是合理的,无法想到更简单的解决方案。
您只需要添加几行就可以了:
var (
mu sync.Mutex
t *time.Timer
)
func restartableDelayed() {
mu.Lock()
defer mu.Unlock()
if t != nil {
t.Stop()
}
t = time.AfterFunc(time.Second, func() {
mu.Lock()
t = nil
mu.Unlock()
// Do the stuff here
})
}
关于go - 如何进行可重新启动的线程安全AfterFunc()调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63357021/
time.AfterFunc() 接受一个持续时间和一个在该持续时间到期时要执行的函数。但该函数不能是接受参数的函数。 例如:不能传递如下函数: func Foo (b *Bar) {} 不过,可以初
我正在尝试创建一个 Circuit breaker pattern , 我想执行命令 exec.Command如果失败,在 X 定义的时间内重试,出于测试目的,我正在做这样的事情来测试 time.Af
我正在尝试设置一个每小时整点运行的服务例程。在我看来,这两者中的任何一个都很容易。要在整点运行我的例程,我可以使用 time.AfterFunc(),首先计算整点前的剩余时间。为了每小时运行一次例程,
我只想在 Go 中做重复的后台任务,使用 time.AfterFunc,但似乎逻辑有问题。输出只是:间隔调用间隔调用 但如果一切正常,至少要调用该函数 5 次。 package main import
如果不遇到几个嵌套函数问题,我不知道如何解决这个 Go 算法问题。其中之一是,“不能在返回参数中使用 func 文字(类型 func())作为类型 func() 字符串”。 我现在使用的解决方案是:
我是一名优秀的程序员,十分优秀!