为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信