我在 go 程序中對 api 進行了大量網(wǎng)絡調(diào)用,結(jié)果存儲在數(shù)據(jù)庫中(使用 mgo)。api 調(diào)用是在單獨的 go 例程上完成的。在其他例程中,我會在更新數(shù)據(jù)庫之前從數(shù)據(jù)庫中提取信息并對其進行處理。當數(shù)據(jù)被放回時,一個標志被設置,以便知道該數(shù)據(jù)已被后處理,因此當程序要求數(shù)據(jù)庫提供另一個條目以進行后處理時,數(shù)據(jù)庫將標志complete設置為false。當標志設置為true,則走常規(guī)關機:wg.done()。一切都很好,我有很多打印輸出告訴我程序是如何運行的,但是在運行結(jié)束時,我得到了一個巨大的堆棧跟蹤,其中包含許多相同的內(nèi)容:goroutine 56731 [sleep]: time.Sleep(0x12a05f200) /usr/local/Cellar/go/1.5/libexec/src/runtime/time.go:59 +0xf9 gopkg.in/mgo%2ev2.(*mongoServer).pinger (0xc82601b420, 0x1) /Users/alex/go/src/gopkg.in/mgo.v2/server.go:295 +0x1b4 由 gopkg.in/mgo%2ev2.newServer /Users/alex/go/src/gopkg 創(chuàng)建.in/mgo.v2/server.go:88 +0x162goroutine 56698 [sleep]: time.Sleep(0x12a05f200) /usr/local/Cellar/go/1.5/libexec/src/runtime/time.go:59 +0xf9 gopkg.in/mgo%2ev2.(*mongoServer).pinger (0xc82601bce0, 0x1) /Users/alex/go/src/gopkg.in/mgo.v2/server.go:295 +0x1b4 由 gopkg.in/mgo%2ev2.newServer /Users/alex/go/src/gopkg 創(chuàng)建.in/mgo.v2/server.go:88 +0x162goroutine 56699 [sleep]: time.Sleep(0x1dcd6500) /usr/local/Cellar/go/1.5/libexec/src/runtime/time.go:59 +0xf9 gopkg.in/mgo%2ev2.(*mongoCluster).syncServersLoop (0xc8256425a0) /Users/alex/go/src/gopkg.in/mgo.v2/cluster.go:353 +0x2b1 由 gopkg.in/mgo%2ev2.newCluster /Users/alex/go/src/gopkg.in 創(chuàng)建/mgo.v2/cluster.go:73 +0x1a0goroutine 56738 [sleep]: time.Sleep(0x12a05f200) /usr/local/Cellar/go/1.5/libexec/src/runtime/time.go:59 +0xf9 gopkg.in/mgo%2ev2.(*mongoServer).pinger (0xc82606fa40, 0x1) /Users/alex/go/src/gopkg.in/mgo.v2/server.go:295 +0x1b4 創(chuàng)建的 gopkg.in/mgo%2ev2.newServer /Users/alex/go/src/gopkg .in/mgo.v2/server.go:88 +0x162我正在努力弄清楚它告訴我什么,它是否鎖定寫入數(shù)據(jù)庫,例程是否沒有關閉以及某些東西是否超時,我不知道。順便說一句,我正在使用 go 1.5。
1 回答
拉莫斯之舞
TA貢獻1820條經(jīng)驗 獲得超10個贊
看起來引用的邏輯每次需要用它做某事時都會撥打 MongoDB,這不是在 HTTP 服務器中保持持續(xù)數(shù)據(jù)庫通信的合適方法。
每次Dial使用 MongoDB 服務器(或副本集或 mongos)時,都會啟動一些后臺活動,以保持集群拓撲在內(nèi)存中保持最新,并保持連接池正常(請注意,在此之后創(chuàng)建的所有會話單個Dial調(diào)用將共享一個連接池)。
Dial每次想要與數(shù)據(jù)庫交談時都調(diào)用意味著每個撥號的所有邏輯都變得獨立,并且在最后一個會話關閉后,后臺活動可能需要一段時間才能關閉。
因此,即使它可以工作,它也非常低效,因為它必須再次了解正在使用的拓撲,它無法使用來自現(xiàn)有池的連接,并且還會產(chǎn)生不必要的背景流失,這正是您在回溯中觀察到的。
- 1 回答
- 0 關注
- 255 瀏覽
添加回答
舉報
0/150
提交
取消
