Golang:在互联网锁定持续太久之后出现恐慌

时间:2016-05-02 19:16:26

标签: go locking

我正在试图弄清楚是什么让我的程序挂起,我的大多数锁都不应该超过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()
}

3 个答案:

答案 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!")
}

游乐场链接:https://play.golang.org/p/WVPp0_Iqlb

答案 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,它就不会出现恐慌而只是停止运行。