我正在试图弄清楚是什么让我的程序挂起,我的大多数锁都不应该超过200毫秒。 (实际上更少!)
我想创建两个新函数(Lock()
和Unlock()
),这样Lock就会有一个计时器,如果Lock被保持超过200毫秒就会发生恐慌。
这是我目前的尝试,但它不起作用,任何提示?
type ShardKV struct {
lockChan chan bool
}
func (kv *App) lock(reason string) {
kv.mu.Lock()
f := func () {
fmt.Println("PANIC: ms passed")
select {
case <- kv.lockChan:
//
default:
panic("PANIC: " + reason)
}
}
time.AfterFunc(time.Second * 10, f)
}
func (kv *App) unlock(reason string) {
kv.lockChan <- true
kv.mu.Unlock()
}
答案 0 :(得分:0)
你的锁定函数等待10秒钟,因为调用了保存select语句的f函数,实现你想要做的事情的简单方法可能就是这样:
func (kv *App) lock(reason string) {
kv.mu.Lock()
select {
case <- kv.lockChan:
//
case <-time.After(time.Second * 10):
panic("PANIC: " + reason)
}
}
答案 1 :(得分:0)
您需要使用time.AfterFunc
的返回值。这是一个有效的例子:
package main
import (
"fmt"
"sync"
"time"
)
type Foo struct {
m sync.Mutex
timer *time.Timer
}
func (f *Foo) lock() {
f.m.Lock()
f.timer = time.AfterFunc(3 * time.Second, func() {
panic("Too long!")
})
}
func (f *Foo) unlock() {
f.timer.Stop()
f.m.Unlock()
}
func main() {
foo := &Foo{
sync.Mutex{},
&time.Timer{},
}
foo.lock()
// Uncomment this to see the difference
//time.Sleep(5 * time.Second)
foo.unlock()
fmt.Println("Success!")
}
答案 2 :(得分:0)
如果锁已经保持200毫秒,你已经说过你希望你的代码发生恐慌,但你给了计时器10秒等待。这将在paning之前等待10秒,而不是200.我已经尝试使用以下方式编辑代码:
package main
import (
"sync"
"fmt"
"time"
)
type App struct {
mu sync.Mutex
lockChan chan bool
}
func (kv *App) lock(reason string) {
kv.mu.Lock()
f := func () {
fmt.Println("PANIC: ms passed")
select {
case <- kv.lockChan:
//
default:
panic("PANIC: " + reason)
}
}
time.AfterFunc(time.Millisecond * 200, f)
}
func (kv *App) unlock(reason string) {
kv.lockChan <- true
kv.mu.Unlock()
}
func NewApp() *App {
app := App{}
app.lockChan = make(chan bool)
return &app
}
func main() {
app := NewApp()
app.lock("locking")
time.Sleep(time.Millisecond * 300)
}
上面的代码工作正常和恐慌。如果将主函数中的持续时间减少到200 * time.Millisecond
,它就不会出现恐慌而只是停止运行。