2 回答

TA貢獻1816條經(jīng)驗 獲得超6個贊
您鎖定調(diào)用并設置了一個功能,它也鎖定了。viperLockvipe.WatchConfig()vipe.OnConfigChangeviperLock
因為你已經(jīng)打過電話,然后它開始打電話給單獨的go例程。它也試圖獲取相同的鎖。這就是存在爭用條件的原因。vipe.WatchConfig()vipe.OnConfigChange
在設置后和釋放鎖后調(diào)用。vipe.WatchConfig()vipe.OnConfigChange
應按如下方式更正。
func loadConfigDynamically() {
go func() {
time.Sleep(time.Second)
viperLock.Lock()
vipe.OnConfigChange(func(e fsnotify.Event) {
viperLock.Lock()
log.Println("config file changed", e.Name)
environment := vipe.GetString("env")
reloadConfig <- environment
viperLock.Unlock()
})
viperLock.Unlock()
vipe.WatchConfig() //this starting call vipe.OnConfigChange
}()
}

TA貢獻1862條經(jīng)驗 獲得超7個贊
可能是 go 認為變量正在同時被兩個 goroutine 修改和訪問,并且修改和訪問的位置沒有鎖定。類似于以下示例:
package main
import (
"time"
)
type Foo struct {
f func(string)
}
func (f *Foo) Watch() {
go func() {
for {
time.Sleep(time.Second * 2)
if f.f != nil {
f.f("hello world")
}
}
}()
}
func (f *Foo) SetF(fun func(string)) {
f.f = fun
}
func main() {
f := Foo{}
f.Watch()
f.SetF(func(s string) {
})
time.Sleep(time.Second * 5)
}
它有一場數(shù)據(jù)競賽。如果我在修改和讀取的地方都放了相同的鎖,就不會有數(shù)據(jù)競爭:
package main
import (
"sync"
"time"
)
var lock sync.Mutex
type Foo struct {
f func(string)
}
func (f *Foo) Watch() {
go func() {
for {
time.Sleep(time.Second * 2)
lock.Lock() // read places
if f.f != nil {
f.f("hello world")
}
lock.Unlock()
}
}()
}
func (f *Foo) SetF(fun func(string)) {
f.f = fun
}
func main() {
f := Foo{}
f.Watch()
lock.Lock() // write places
f.SetF(func(s string) {
})
lock.Unlock()
time.Sleep(time.Second * 5)
}
或者消除兩個哥律同時閱讀和寫入的可能性會很好:
func main() {
f := Foo{}
f.SetF(func(s string) {
})
f.Watch()
time.Sleep(time.Second * 5)
}
- 2 回答
- 0 關注
- 94 瀏覽
添加回答
舉報