亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang Mgo 起搏

Golang Mgo 起搏

Go
翻閱古今 2021-07-16 19:15:41
我正在編寫一個快速寫入 mongodb 的應用程序。mongodb 和 mgo 處理速度太快了。我的問題是,有沒有辦法讓我確定 mongo 跟不上并開始阻塞?但我也不想不必要地阻止。這是模擬問題的代碼示例:package mainimport (  "labix.org/v2/mgo"  "time"  "fmt")// in database name is a string and age is an inttype Dog struct{  Breed string "breed"}type Person struct{  Name string "name"  Pet Dog `bson:",inline"`  Ts        time.Time}func insert(session *mgo.Session, bob Person){  err := session.DB("db_log").C("people").Insert(&bob)  if err != nil {    panic("Could not insert into database")  }}func main() {  session, _ := mgo.Dial("localhost:27017")  bob := Person{Name : "Robert", Pet : Dog{}}  i := 0  for {    time.Sleep(time.Duration(1) * time.Microsecond)    i++    go insert(session, bob)  }}我經常收到以下錯誤:panic: Could not insert into database或者panic: write tcp 127.0.0.1:27017: i/o timeout
查看完整描述

2 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

我懷疑如果你允許 Go 使用多個線程和Copy() 然后 Close()你的會話,你會獲得更好的性能。

要回答您的問題,這可能是頻道的完美用例。在一個 goroutine 中將項目送入通道,并在另一個 goroutine 中使用它們/將它們寫入 Mongo。您可以調整通道的大小以滿足您的需要。一旦通道已滿,生產者線程將在嘗試向其發送時阻塞。

您可能還想使用Safe()方法設置。設置 W:0 將使 Mongo 處于“即發即忘”模式,這將極大地提高性能,但可能會丟失一些數據。您還可以更改超時時間。


查看完整回答
反對 回復 2021-07-19
  • 2 回答
  • 0 關注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號